Задайте различные элементы активности для UIActivityViewController Swift
У меня есть UIActivityViewController
с 4 параметрами: Message/Mail/TW/FB.
Я хочу отправить различные действия для каждого варианта!
Например:
В листе iMessage
мне нужно поставить: String
, NSURL
и UIImage
.
В Mail мне нужно поместить строку в поле Subject, затем String в теле, UIImage
и NSURL
.
В TW/FB
я хочу разместить изображение, подобное сообщению socials, и некоторые String и NSURL
.
Есть ли у вас какие-либо идеи, возможно ли это в iOS8 с помощью Swift?
Я много искал для некоторых фрагментов кода, не нашел для меня лучшего.
Ответы
Ответ 1
Вы должны использовать протокол UIActivityItemSource
. Параметр activityItems
инициализатора UIActivityViewController
принимает либо массив объектов данных, либо массив объектов, реализующих протокол UIActivityItemSource
.
В качестве примера рассмотрим источник элемента, например следующий.
class MyStringItemSource: NSObject, UIActivityItemSource {
@objc func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject {
return ""
}
@objc func activityViewController(activityViewController: UIActivityViewController, itemForActivityType activityType: String) -> AnyObject? {
if activityType == UIActivityTypeMessage {
return "String for message"
} else if activityType == UIActivityTypeMail {
return "String for mail"
} else if activityType == UIActivityTypePostToTwitter {
return "String for twitter"
} else if activityType == UIActivityTypePostToFacebook {
return "String for facebook"
}
return nil
}
func activityViewController(activityViewController: UIActivityViewController, subjectForActivityType activityType: String?) -> String {
if activityType == UIActivityTypeMessage {
return "Subject for message"
} else if activityType == UIActivityTypeMail {
return "Subject for mail"
} else if activityType == UIActivityTypePostToTwitter {
return "Subject for twitter"
} else if activityType == UIActivityTypePostToFacebook {
return "Subject for facebook"
}
return ""
}
func activityViewController(activityViewController: UIActivityViewController, thumbnailImageForActivityType activityType: String!, suggestedSize size: CGSize) -> UIImage! {
if activityType == UIActivityTypeMessage {
return UIImage(named: "thumbnail-for-message")
} else if activityType == UIActivityTypeMail {
return UIImage(named: "thumbnail-for-mail")
} else if activityType == UIActivityTypePostToTwitter {
return UIImage(named: "thumbnail-for-twitter")
} else if activityType == UIActivityTypePostToFacebook {
return UIImage(named: "thumbnail-for-facebook")
}
return UIImage(named: "some-default-thumbnail")
}
}
Вышеупомянутый источник источника возвращает различные объекты данных, предметы и уменьшенные изображения, основанные на типе активности. Для использования вам просто нужно передать его в инициализатор UIActivityViewController
.
UIActivityViewController(activityItems: [MyStringItemSource()], applicationActivities: nil)
Аналогичным образом вы можете определить пользовательский класс MyUrlItemSource
, который возвращает разные URL-адреса на основе выбранного действия и передает его в инициализаторе.
UIActivityViewController(activityItems: [MyStringItemSource(), MyUrlItemSource()], applicationActivities: nil)
Все это описано в официальной документации для UIActivityViewController
и UIActivityItemSource
Ответ 2
То же решение, что и hennes, переведено на быстро <3 >
class MyStringItemSource: NSObject, UIActivityItemSource {
public func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
return ""
}
public func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivityType) -> Any? {
if activityType == UIActivityType.message {
return "String for message"
} else if activityType == UIActivityType.mail {
return "String for mail"
} else if activityType == UIActivityType.postToTwitter {
return "String for twitter"
} else if activityType == UIActivityType.postToFacebook {
return "String for facebook"
}
return nil
}
public func activityViewController(_ activityViewController: UIActivityViewController, subjectForActivityType activityType: UIActivityType?) -> String {
if activityType == UIActivityType.message {
return "Subject for message"
} else if activityType == UIActivityType.mail {
return "Subject for mail"
} else if activityType == UIActivityType.postToTwitter {
return "Subject for twitter"
} else if activityType == UIActivityType.postToFacebook {
return "Subject for facebook"
}
return ""
}
public func activityViewController(_ activityViewController: UIActivityViewController, thumbnailImageForActivityType activityType: UIActivityType?, suggestedSize size: CGSize) -> UIImage? {
if activityType == UIActivityType.message {
return UIImage(named: "thumbnail-for-message")
} else if activityType == UIActivityType.mail {
return UIImage(named: "thumbnail-for-mail")
} else if activityType == UIActivityType.postToTwitter {
return UIImage(named: "thumbnail-for-twitter")
} else if activityType == UIActivityType.postToFacebook {
return UIImage(named: "thumbnail-for-facebook")
}
return UIImage(named: "some-default-thumbnail")
}
}
Ответ 3
Objective-C эквивалент hennes answer:
@interface MyStringItemSource : NSObject <UIActivityItemSource>
{
}
@end
@implementation MyStringItemSource
-(id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController
{
return @"";
}
-(id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(UIActivityType)activityType
{
if (activityType == UIActivityTypeMessage) {
return @"String for message";
} else if (activityType == UIActivityTypeMail) {
return @"String for mail";
}
return nil;
}
-(NSString *)activityViewController:(UIActivityViewController *)activityViewController subjectForActivityType:(UIActivityType)activityType
{
if (activityType == UIActivityTypeMessage) {
return @"Subject for message";
} else if (activityType == UIActivityTypeMail) {
return @"Subject for mail";
}
return @"";
}
-(UIImage *)activityViewController:(UIActivityViewController *)activityViewController thumbnailImageForActivityType:(UIActivityType)activityType suggestedSize:(CGSize)size
{
if (activityType == UIActivityTypeMessage) {
return [UIImage imageNamed: @"thumbnail-for-message"];
} else if (activityType == UIActivityTypeMail) {
return [UIImage imageNamed: @"thumbnail-for-mail"];
}
return [UIImage imageNamed: @"thumbnail-for-default"];
}
@end