2015-11-26 9 views
7

मैं क्या एक स्थिति है कि ज्यादातर लोग सामना करना पड़ता है जब iPad पर एक UIActivityViewController पेश करने के लिए कोशिश कर रहा है की तरह लग रहा भर में आ गए हैं; इसके साथ क्रैश हो रहा है:UIActivityViewController 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 जो कुछ छवियों का प्रदर्शन किया जाता है और जब है उपयोगकर्ता शेयर बटन हिट करता है, मैं पॉपअप के लिए आईओएस 8 स्टाइल शेयर शीट की उम्मीद कर रहा हूं। आईफोन पर यह बिल्कुल होता है, लेकिन आईपैड पर, यह क्रैश हो रहा है। यही कारण है कि मुझे ओवरफ्लो स्टैक करने के लिए नेतृत्व, लेकिन सवाल (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 initialising नहीं कर रहे हैं तो यह हमेशा नहीं के बराबर हो जाएगा।

प्रयास करें:

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

धन्यवाद जेडी - मैं सिर्फ आईआईओ 8/9 शेयर शीट की तरह UIActivityViewController को सक्रिय करने की कोशिश कर रहा हूं। मैंने आईपैड पर सफारी से एक छवि शामिल करने के लिए अभी सवाल को अपडेट किया है - यह सीधे उस बटन के नीचे आता है लेकिन मेरा अजीब – 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) 
संबंधित मुद्दे