2015-05-05 1 views
24

У меня есть UIActivityViewController с 4 вариантами: Сообщение/Почта/TW/FB. Я хочу отправить различные действия для каждого варианта!Задайте различные действия для UIActivityViewController Swift

Для например: В iMessage листа, мне нужно поставить: String, NSURL и UIImage. В Mail Мне нужно поместить строку в поле Subject, затем String в теле, UIImage и NSURL также. В TW/FB Я хочу разместить изображение как социальный пост сделал это, а также некоторые строки и NSURL.

У вас есть идеи, если это возможно в iOS8 с Swift?

Я много искал для некоторых фрагментов кода, не нашел лучшего для меня.

ответ

39

Вы должны воспользоваться протоколом 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

+0

Большое спасибо! – Bonnke

+0

Хороший человек, приятный прикосновение! –

+0

этот код доступен для объектива-c? –

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") 
} 

}

0

Objective-C эквивалент hennes Ответ:

@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