2015-11-26 9 views
7

iPadにUIActivityViewControllerを表示しようとするとほとんどの人が直面するような状況に遭遇しました。ここに私のコードですUIActivityViewControllerがsourceViewまたはbarButtonItemを使用してiPadでクラッシュする

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

:私のviewDidLoad

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


    } 

、私がしている:

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

    self.navigationItem.rightBarButtonItem = composeButton; 
} 

このビューには、いくつかの画像を展示されUIPageViewControllerあるとクラッシュしますユーザーが共有ボタンを押すと、私はiOS 8スタイルの共有シートがポップアップすることを期待しています。これはまさにiPhoneで起こることですが、iPadではクラッシュし続けます。それはスタックオーバーフローにつながったが、私のために質問(crash on showing UIPopOverPresentationControlleriOS Crash: Terminating app due to uncaught exception reason: UIPopoverPresentationController should have a non-nil sourceViewUIWebViewTerminating app due to UIPopoverPresentationControllerios8 iPad uiwebview crashes while displaying popover when user taps drop down list HTML select tagなど)のどれも働かない。

私はそこにすべてのソリューションを試しましたが、私はこれで必要なものをかなり得ています。

これは私が達成しようとしているものです:

enter image description here この上の任意の考えは本当にいただければ幸いです。

答えて

14

iPad上のactivityViewControllerを初期化していないので、常にゼロになります。

は試してみてください。

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

そして画像のようにそれを表示するには:

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

こんにちは@JDx - これは簡単でした!簡単な質問で申し訳ありませんが、それは魅力的に機能しました!ありがとうございました!しかし、ちょうどフォローアップの質問をする - 私はポップアップから来る側を制御することはできますか?今は、画面の左上から来ていますが、実際にはボタンは右上にあります。 – amitsbajaj

+0

問題ありません!私はあなたができるとは思わない、多分UiPopoverControllerを代わりに使うことができるだろうか? – JDx

+0

ありがとうJD - iOS 8/9共有シートのように、UIActivityViewControllerをアクティブにしようとしています。私はちょうどiPadのSafariからの画像を含むように質問を更新しました - それはそのボタンの下にまっすぐに来ますが、私は奇妙な左に表示されます – amitsbajaj

1

は、あなただけのpopoverPresentationControllerを設定することができます(_shareBarButtonあなたはポップオーバーから表示したいUIBarButtonItemです) iPadのbarButtonItemの例:

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

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

self.present(activityViewController, animated: true) 
関連する問題