UIActivityViewController se bloquea en iPad con sourceView o barButtonItem

Me he encontrado con lo que parece ser una situación que la mayoría de las personas enfrentan cuando intentan presentar un UIActivityViewController en el iPad; se está estrellando con:

 Terminating app due to uncaught exception 'NSGenericException', reason: 'UIPopoverPresentationController (<_UIAlertControllerActionSheetRegularPresentationController: 0x7fc4f2d87d00>) should have a non-nil sourceView or barButtonItem set before the presentation occurs. 

Aquí está mi código:

 - (void)shareLeaflet { NSString *forwardedString = [[NSString alloc] initWithFormat:@"Check out this leaflet\n\n %@ \n\nself.theURLToShare]; UIActivityViewController *activityViewController = nil; if (IDIOM == IPAD) { NSLog(@"iPad"); activityViewController.popoverPresentationController.sourceView = self.view; // activityViewController.popoverPresentationController.sourceRect = self.frame; [self presentViewController:activityViewController animated:YES completion:nil]; } else { NSLog(@"iPhone"); activityViewController = [[UIActivityViewController alloc] initWithActivityItems:[NSArray arrayWithObjects:forwardedString, nil] applicationActivities:nil]; [self presentViewController:activityViewController animated:YES completion:nil]; } 

En mi viewDidLoad , viewDidLoad , tengo:

 UIBarButtonItem *composeButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(shareLeaflet)]; self.navigationItem.rightBarButtonItem = composeButton; } 

Esta vista es un UIPageViewController que muestra algunas imágenes y cuando el usuario UIPageViewController al button compartir, espero que la hoja de compartir de estilo iOS 8 se muestre. Esto es exactamente lo que sucede en el iPhone, pero en el iPad, sigue fallando. Eso me llevó a Stack Overflow, pero ninguna de las preguntas ( falla mostrando UIPopOverPresentationController , iOS Crash: Terminando la aplicación debido a la razón de exception no detectada: UIPopoverPresentationController debería tener una aplicación SourceView , UIWebView Terminating no nula debido a UIPopoverPresentationController , ios8 iPad uiwebview se bloquea mientras se muestra popover cuando el usuario toca la list desplegable de selección de HTML , etc.) funciona para mí.

He intentado todas las soluciones allí y acabo de get lo que se requiere con esto.

Esto es lo que estoy tratando de lograr:

introduzca la descripción de la imagen aquí Cualquier pensamiento sobre esto sería muy apreciado.

No está inicializando el activityViewController en iPad, por lo que siempre será nulo.

Tratar:

 - (void)shareLeaflet { NSString *forwardedString = [[NSString alloc] initWithFormat:@"Check out this leaflet\n\n %@ \n\nself.theURLToShare]; UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:[NSArray arrayWithObjects:forwardedString, nil] applicationActivities:nil]; if (IDIOM == IPAD) { NSLog(@"iPad"); activityViewController.popoverPresentationController.sourceView = self.view; // activityViewController.popoverPresentationController.sourceRect = self.frame; [self presentViewController:activityViewController animated:YES completion:nil]; } else { NSLog(@"iPhone"); [self presentViewController:activityViewController animated:YES completion:nil]; } 

Y luego para mostrarlo como en la image: (_shareBarButton es el elemento UIBarButtonItem del que desea que se muestre el popover)

 - (void)shareLeaflet { NSString *forwardedString = [[NSString alloc] initWithFormat:@"Check out this leaflet\n\n %@ \n\nself.theURLToShare]; UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:[NSArray arrayWithObjects:forwardedString, nil] applicationActivities:nil]; if (IDIOM == IPAD) { NSLog(@"iPad"); activityViewController.popoverPresentationController.sourceView = self.view; // activityViewController.popoverPresentationController.sourceRect = self.frame; _popover = [[UIPopoverController alloc] initWithContentViewController:activityViewController]; _popover.delegate = self; [_popover presentPopoverFromBarButtonItem:_shareBarButton permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; } else { NSLog(@"iPhone"); [self presentViewController:activityViewController animated:YES completion:nil]; } 

Puede configurar el popoverPresentationController de barButtonItem para iPad, por ejemplo:

 let activityViewController = UIActivityViewController(activityItems: ["Hello, world!", urlString], applicationActivities: nil) if UIDevice.current.userInterfaceIdiom == .pad { activityViewController.popoverPresentationController?.barButtonItem = barButtonItem } self.present(activityViewController, animated: true)