ios8 - Compartir a través de UIActivityViewController a Twitter/Facebook etc. causando bloqueo
(4)
Mirando los documentos , necesitaba definir una vista fuente para el controlador popover
UIActivityViewController *controller =
[[UIActivityViewController alloc]
initWithActivityItems:@[text,url,myImage]
applicationActivities:nil];
[self presentViewController:controller animated:YES completion:nil];
UIPopoverPresentationController *presentationController =
[controller popoverPresentationController];
presentationController.sourceView = self.view;
En iOS8 estoy usando un UIActivityViewController para compartir un UIImage a Facebook / Twitter, etc. Parecía estar funcionando bien, pero hoy de repente comenzó a fallar cuando ejecuté el código en mi iPad. Sin embargo, todavía funciona como se esperaba en el simulador.
Mi código:
UIActivityViewController *controller =
[[UIActivityViewController alloc]
initWithActivityItems:@[text, url, myImage]
applicationActivities:nil];
[self presentViewController:controller animated:YES completion:nil];
Al estrellarse, Xcode escupe:
Extensiones descubiertas: {({id = com.apple.share.Facebook.post}, {id = com.apple.share.Twitter.post}, {id = com.apple.share.TencentWeibo.post}, {id = com.apple.share.SinaWeibo.post})} para los atributos: {NSExtensionActivationRule = {extensionItems = ({attachments = ({registeredTypeIdentifiers = ("public.image");}, {registeredTypeIdentifiers = ("public.plain-text" );}, {registeredTypeIdentifiers = ("public.url");});}); }; NSExtensionPointName = ("com.apple.share-services", "com.apple.ui-services", "com.apple.services"); } 2014-08-07 21: 38: 59.208 collageTest [279: 11021] LaunchServices: invalidaciónHandler llamado 2014-08-07 21: 38: 59.212 collageTest [279: 11016] Extensiones descubiertas: {({id = com.apple.share .Flickr.post}, {id = com.apple.mobileslideshow.StreamShareService}, {id = com.apple.share.Twitter.post}, {id = com.apple.share.Facebook.post}, {id = com .apple.share.Vimeo.post}, {id = com.apple.share.SinaWeibo.post}, {id = com.apple.share.TencentWeibo.post})} para los atributos: {NSExtensionPointName = "com.apple. servicios compartidos "; } 2014-08-07 21: 38: 59.216 collageTest [279: 11021] LaunchServices: invalidationHandler called
Así es como lo resolví con rapidez:
let someText:String = "shareText"
let google:NSURL = NSURL(string:"http://google.com")!
let activityViewController = UIActivityViewController(activityItems: [someText, google], applicationActivities: nil)
if respondsToSelector("popoverPresentationController") {
self.senderView.presentViewController(activityViewController, animated: true, completion: nil)
activityViewController.popoverPresentationController?.sourceView = sender
}else{
senderView.presentViewController(activityViewController, animated: true, completion: nil)
}
popoverPresentationController
era nuevo en iOS 8 y se bloqueará en iOS 7. También será nulo en iPhone porque solo está en UIPopover
en iPad. Aquí está la respuesta de Christian en Swift, con esos hechos tomados en cuenta:
Swift 2.0 (Xcode 7)
let controller = UIActivityViewController(activityItems: [text, url, myImage], applicationActivities: nil)
presentViewController(controller, animated: true, completion: nil)
if #available(iOS 8.0, *) {
let presentationController = controller.popoverPresentationController
presentationController?.sourceView = view
}
Swift 1.2 (Xcode 6)
let controller = UIActivityViewController(activityItems: [text, url, myImage], applicationActivities: nil)
presentViewController(controller, animated: true, completion: nil)
if controller.respondsToSelector("popoverPresentationController") {
// iOS 8+
let presentationController = controller.popoverPresentationController
presentationController?.sourceView = view
}
Como se dice en @mmccomb aquí , en el iPad el controlador de vista de actividad se mostrará como un popover usando el nuevo UIPopoverPresentationController. Debe especificar al menos la vista de origen:
activityViewController.popoverPresentationController.sourceView = YOURDESIREDVIEW;
Si desea mostrar el popover anclado en cualquier punto de esa vista, especifíquelo con la propiedad sourceRect del popoverPresentationController.