2015-11-26 35 views
7

mam natknąć co wygląda sytuacja, że ​​większość ludzi, gdy starają się przedstawić UIActivityViewController na iPadzie; jest upaść z:UIActivityViewController upaść na iPada z sourceView lub barButtonItem

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

Oto mój kod:

- (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]; 


    } 

W moim viewDidLoad, mam:

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

    self.navigationItem.rightBarButtonItem = composeButton; 
} 

Pogląd ten jest UIPageViewController który prezentuje kilka zdjęć i kiedy użytkownik kliknął przycisk udostępniania, oczekuję wyskakującego arkusza akcji w stylu iOS 8. Tak właśnie dzieje się na iPhone'u, ale na iPadzie nadal się zawiesza. Które doprowadziły mnie do przepełnienie stosu, ale żadne z pytań (crash on showing UIPopOverPresentationController, iOS Crash: Terminating app due to uncaught exception reason: UIPopoverPresentationController should have a non-nil sourceView, UIWebViewTerminating app due to UIPopoverPresentationController, ios8 iPad uiwebview crashes while displaying popover when user taps drop down list HTML select tag, etc) praca dla mnie.

Próbowałem wszystkich rozwiązań tam, a ja po prostu zupełnie się tego, co jest wymagane w tym.

To co usiłuję osiągnąć:

enter image description here Wszelkie myśli o tym by być naprawdę doceniane.

Odpowiedz

14

Nie jesteś initializacji activityViewController na iPada tak zawsze będzie zerowe.

Spróbuj:

- (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]; 
    } 

A następnie wyświetlać je jak na obrazku: (_shareBarButton jest UIBarButtonItem że chcesz popover do wyświetlania z)

- (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]; 
     } 
+0

Witam @JDx - ah man, to było łatwe ! Przepraszam za łatwe pytanie, które działało jak czar! Dziękuję Ci! Ale po prostu zadać pytanie uzupełniające - czy mogę kontrolować, z której strony pochodzi popup? W tej chwili pochodzi z lewego górnego rogu ekranu, ale przycisk znajduje się w prawym górnym rogu. – amitsbajaj

+0

Nie ma problemu! Nie sądzę, że możesz, może zamiast tego możesz użyć kontrolera UiPopoverController? – JDx

+0

Dzięki JD - Próbuję tylko aktywować UIActivityViewController, tak jak i arkusz Share w iOS 8/9. Właśnie zaktualizowałem pytanie, aby dołączyć obraz z Safari na iPadzie - pojawia się prosto pod tym przyciskiem, ale moje pojawia się po lewej stronie, co jest dziwne. – amitsbajaj

1

można po prostu ustawić popoverPresentationControllerbarButtonItem dla iPada, na przykład:

let activityViewController = UIActivityViewController(activityItems: ["Hello, world!", urlString], applicationActivities: nil) 

if UIDevice.current.userInterfaceIdiom == .pad { 
    activityViewController.popoverPresentationController?.barButtonItem = barButtonItem 
} 

self.present(activityViewController, animated: true)