ios swift uiactivityviewcontroller

ios - Establecer diferentes elementos de actividad para UIActivityViewController Swift



(3)

Debe aprovechar el protocolo UIActivityItemSource . El parámetro activityItems del inicializador de UIActivityViewController acepta una matriz de objetos de datos o una matriz de objetos que implementan el protocolo UIActivityItemSource .

Como ejemplo, considere una fuente de elemento como la siguiente.

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

La fuente del elemento anterior devuelve diferentes objetos de datos de cadena, temas e imágenes en miniatura según el tipo de actividad. Para usarlo, solo necesita pasarlo al inicializador UIActivityViewController .

UIActivityViewController(activityItems: [MyStringItemSource()], applicationActivities: nil)

Del mismo modo, puede definir una clase personalizada MyUrlItemSource que devuelve diferentes URL en función de la actividad seleccionada y pasarla en el inicializador.

UIActivityViewController(activityItems: [MyStringItemSource(), MyUrlItemSource()], applicationActivities: nil)

Todo esto se describe en la documentación oficial de UIActivityViewController y UIActivityItemSource

Tengo UIActivityViewController con 4 opciones: Mensaje / Correo / TW / FB . ¡Quiero enviar diferentes actividades para cada opción!

Por ejemplo: en la hoja de iMessage , necesito poner: String , NSURL y UIImage . En Mail, necesito colocar la cadena en el campo Asunto, luego la cadena en el cuerpo, UIImage y NSURL también. En TW/FB quiero colocar una imagen como lo hizo la publicación de NSURL sociales, también algunos String y NSURL .

¿Tienes alguna idea de si esto es posible en iOS8, con Swift?

Busqué muchas piezas de código, no encontré lo mejor para mí.


Misma solución como la de traducida a swift 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") } }


Objetivo-C equivalente de respuesta:

@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