2015-11-26 2 views
7

Я столкнулся с ситуацией, с которой сталкивается большинство людей при попытке представитьна iPad; это происходит сбой с:Ошибка UIActivityViewController на iPad с sourceView или 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. 

Вот мой код:

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


    } 

В моей viewDidLoad, у меня есть:

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

    self.navigationItem.rightBarButtonItem = composeButton; 
} 

Эта точка зрения является UIPageViewController, который является демонстрация некоторых изображений и когда пользователь нажимает кнопку «Поделиться», я ожидаю, что всплывающее окно с файлом стиля iOS 8 появится. Это именно то, что происходит на iPhone, но на iPad он продолжает падать. Это привело меня к переполнению стека, но ни один из вопросов (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 и т. Д.) Работает для меня.

Я пробовал все решения там, и я просто получил то, что требуется с этим.

Это то, что я пытаюсь достичь:

enter image description here Любые мысли по этому вопросу будет очень ценна.

ответ

14

Вы не инициализируете ActivityViewController на iPad, поэтому он всегда будет нулевым.

Try:

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

И затем, чтобы отобразить его, как на картинке: (_shareBarButton является UIBarButtonItem, что вы хотите поповер для отображения из)

- (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. Я просто пытаюсь активировать UIActivityViewController, например, лист IOS 8/9 Share. Я только что обновил вопрос, чтобы включить изображение из Safari на iPad - он идет прямо под этой кнопкой, но мой появляется слева, это странно. – amitsbajaj

1

Вы можете просто установить popoverPresentationControllerbarButtonItem для iPad, например:

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

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

self.present(activityViewController, animated: true) 
Смежные вопросы