ios8 uiactivityviewcontroller

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.