Actualmente estoy probando mi aplicación con Xcode 6 (Beta 6). UIActivityViewController funciona bien con dispositivos y simuladores de iPhone, pero se bloquea con simuladores y dispositivos de iPad (iOS 8) con los siguientes registros
Terminating app due to uncaught exception 'NSGenericException',
reason: 'UIPopoverPresentationController
(<_UIAlertControllerActionSheetRegularPresentationController: 0x7fc7a874bd90>)
should have a non-nil sourceView or barButtonItem set before the presentation occurs.
Estoy usando el siguiente código para iPhone y iPad tanto para iOS 7 como para iOS 8
NSData *myData = [NSData dataWithContentsOfFile:_filename];
NSArray *activityItems = [NSArray arrayWithObjects:myData, nil];
UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:nil applicationActivities:nil];
activityViewController.excludedActivityTypes = @[UIActivityTypeCopyToPasteboard];
[self presentViewController:activityViewController animated:YES completion:nil];
Estoy teniendo un bloqueo similar en una de mis otras aplicaciones también. ¿Puedes por favor guiarme? ¿Ha cambiado algo con UIActivityViewController en iOS 8? Lo comprobé pero no encontré nada sobre esto
ios
objective-c
ios8
uiactivityviewcontroller
Bhumit Mehta
fuente
fuente
Respuestas:
En iPad, el controlador de vista de actividad se mostrará como un popover usando el nuevo UIPopoverPresentationController , requiere que especifique un punto de anclaje para la presentación del popover usando una de las tres propiedades siguientes:
Para especificar el punto de anclaje, deberá obtener una referencia al UIPopoverPresentationController de UIActivityController y establecer una de las propiedades de la siguiente manera:
fuente
if ( [activityViewController respondsToSelector:@selector(popoverPresentationController)] ) { // iOS8 activityViewController.popoverPresentationController.sourceView = _shareItem; }
El mismo problema vino a mi proyecto, entonces encontré la solución para abrir el
UIActivityViewController
en el iPad tenemos que usarUIPopoverController
Aquí hay un código para usarlo tanto en iPhone como en iPad:
Para swift 4.2 / swift 5
fuente
Me encontré con este problema exacto recientemente (la pregunta original) en Swift 2.0, donde
UIActivityViewController
funcionó bien para iPhones, pero causó fallas al simular iPads.Solo quiero agregar a este hilo de respuestas aquí que, al menos en Swift 2.0, no necesita una declaración if. Puedes hacer el
popoverPresentationController
opcional.Como comentario rápido, la respuesta aceptada parece estar diciendo que podría tener solo sourceView, solo sourceRect o solo barButtonItem, pero de acuerdo con la documentación de Apple para UIPopoverPresentationController necesita uno de los siguientes:
El ejemplo particular en el que estaba trabajando está abajo, donde estoy creando una función que toma un
UIView
(para sourceView y sourceRect) yString
(el único elemento de actividad UIActivityViewController).Este código funciona en iPhone y iPad (e incluso en tvOS, creo), si el dispositivo no es compatible
popoverPresentationController
, las dos líneas de código que lo mencionan se ignoran esencialmente.¡Qué bueno que todo lo que necesita hacer para que funcione para iPads es simplemente agregar dos líneas de código, o solo una si está usando un elemento BarButtonItem!
fuente
respondsToSelector
oUIUserInterfaceIdiom
, además, parece adaptarse mejor a Swift como lenguaje. AunquerespondsToSelector
parece que es necesario para iOS7, si usa versiones más nuevas de iOS, definitivamente este es el camino a seguir.Veo a muchas personas codificando iPhone / iPad, etc., mientras usan el código Swift.
Esto no es necesario, debe usar las funciones del idioma. El siguiente código asume que usará un UIBarButtonItem y funcionará tanto en iPhone como en iPad.
Observe cómo no hay declaraciones If o cualquier otra cosa loca. El desenvolvimiento opcional será nulo en iPhone, por lo que la línea
vc.popoverPresentationController?
no hará nada en iPhone.fuente
vc.popoverPresentationController?.barButtonItem = navigationItem.rightBarButtonItem
antes de presentar el controlador de vista.shareTapped()
:vc.popoverPresentationController?.barButtonItem = sender as? UIBarButtonItem
ambos todavía se estrelló. ¿Qué estoy haciendo mal? Mientras estoy aquí, ¿cómo puedo llenar el popover con los diferentes servicios compartidos como Facebook, Twitter, etc.?sender
efectivamente es aUIBarButtonItem
. Verifique que vc no lo seanil
. Compruebe que puede presentar un ViewController ... sin mirar el bloqueo / código es difícil de decir. Los servicios se completarán automáticamente si el usuario tiene instalada la aplicación (a menos que haya decidido explícitamente excluir algunos).Solución usando Xamarin.iOS.
En mi ejemplo, estoy haciendo una captura de pantalla, produciendo una imagen y permitiendo que el usuario comparta la imagen. La ventana emergente en el iPad se coloca en el medio de la pantalla.
fuente
Swift, iOS 9/10 (después de que UIPopoverController en desuso)
fuente
En Swift para arreglar esto para iPad, la mejor manera es hacer lo que encontré.
fuente
Si muestra
UIActivityViewController
cuando hace clic en un,UIBarButtonItem
use el siguiente código:De lo contrario, si usa otro control, por ejemplo a
UIButton
, use el siguiente código:De la documentación a
UIPopoverPresentationController
:fuente
Arreglo para Swift 2.0
fuente
Swift 3:
fuente
Rápido:
fuente
Solución para Objective-C y con uso UIPopoverPresentationController
fuente
Intenté el siguiente código y funciona:
primero coloque un elemento de botón de barra en su controlador de vista y luego cree un IBOutlet:
@property(weak,nonatomic)IBOutlet UIBarButtonItem *barButtonItem;
siguiente en el archivo .m:
yourUIActivityViewController.popoverPresentationController.barButtonItem = self.barButtonItem;
fuente
swift = ios7 / ios8
fuente
Encontré esta solución En primer lugar, su controlador de vista que presenta el popover debe implementar el
<UIPopoverPresentationControllerDelegate>
protocolo.A continuación, deberá configurar el
popoverPresentationController
delegado de.Agregue estas funciones:
fuente
En swift 4 el siguiente código funciona en iphone y ipad. De acuerdo con la documentación
fuente
Estoy usando Swift 5. Tuve el mismo problema de bloqueo cuando hice clic en "Compartir botón" en mi aplicación en iPad. Encontré una esta solución. paso 1: Agregue el objeto "ver" (busque "UIView" en la biblioteca de objetos) al Main.storyboard. Paso 2: Cree un @IBOutlet en ViewController.swift y asigne cualquier nombre (por ejemplo: view1)
Paso 3: agrega el nombre anterior (por ejemplo: view1) como sourceView. Esta es mi acción de "botón Compartir".
Soy muy nuevo en Swift y estuve atrapado en esto durante una semana. Espero que esto ayude a alguien. entonces compartiendo esta solución.
fuente
Para Swift 2.0. Descubrí que esto funciona si estás tratando de anclar el popover a un botón de compartir en iPad. Esto supone que ha creado una salida para el botón compartir en su barra de herramientas.
fuente
Tenga cuidado si está desarrollando para iPad usando swift, funcionará bien en la depuración, pero se bloqueará en el lanzamiento. Para que funcione con testFlight y AppStore, desactive la optimización para Swift usando
-none
para el lanzamiento.fuente