37

मैं निम्न चेतावनी हो रही है जब मैं नेविगेशन नियंत्रक पर एक ActivityController पेश करने के लिए प्रयास करते हैं,आईओएस: चेतावनी

Attempt to present <UIActivityViewController: 0x15be1d60> on <UINavigationController: 0x14608e80> whose view is not in the window hierarchy! 

मैं दृश्य नियंत्रक पेश करने के लिए कोशिश की है "ViewController जिसका दृश्य खिड़की पदानुक्रम में नहीं है पेश करने के लिए प्रयास" कोड का पालन करके,

UIActivityViewController * activityController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:applicationActivities]; 
    activityController.excludedActivityTypes = excludeActivities; 

    UIViewController *vc = self.view.window.rootViewController; 
    [vc presentViewController: activityController animated: YES completion:nil]; 

    [activityController setCompletionHandler:^(NSString *activityType, BOOL completed) { 
     NSLog(@"completed"); 

    }]; 

क्या गलत हो रहा है?

+2

'[स्वयं उपस्थित दृश्य नियंत्रक: गतिविधि नियंत्रक एनिमेटेड: हाँ समापन: शून्य];' –

+0

@ मिथुन एमपी: हाँ का उपयोग करें। काम किया। धन्यवाद दोस्त। :) – iOSNoob

उत्तर

33

आप rootViewController से व्यू कंट्रोलर प्रस्तुत करने का प्रयास कर रहे हैं। आपके मामले में मुझे लगता है कि rootViewController वर्तमान व्यू कंट्रोलर नहीं है। या तो आपने इसके ऊपर एक नया UIViewController प्रस्तुत या धक्का दिया। आपको शीर्ष दृश्य नियंत्रक से स्वयं दृश्य नियंत्रक प्रस्तुत करना चाहिए।

UIViewController *vc = self.view.window.rootViewController; 
[vc presentViewController: activityController animated: YES completion:nil]; 

लिए:

[self presentViewController: activityController animated: YES completion:nil]; 
+3

आप देखने के लिए एक और दृश्य नियंत्रक को कॉल करने के लिए विधि को स्थानांतरित कर सकते हैं DidAppear: –

+2

@TiagoAmaral: ओपी का प्रश्न अलग है, आपकी टिप्पणी इस वर्तमान संदर्भ में मान्य नहीं है। अगर आप उस कोड को डीडएपियर में डाल रहे हैं, तो आपको कई मामलों को संभालने की आवश्यकता है। viewWill/DidAppear विधियों को कई बार बुलाया जाएगा (जैसे प्रस्तुत किए गए दृश्य नियंत्रक के बाद, एक चेतावनी खारिज करने के बाद)। इसलिए यदि आप उस कोड को डीडएपियर में देखते हैं तो आपको इन मामलों को संभालने की आवश्यकता है। –

+0

openUrl विधि को संभालने के दौरान हम क्या कर सकते हैं? –

6

विश्लेषण:

आप को बदलने की जरूरत क्योंकि वर्तमान मोडल दृश्य ViewController वर्ग विंडो में नहीं लोड किया गया है। यह इमारत के बराबर है, दूसरी मंजिल नहीं बनाई गई है, सीधे 3 मंजिल को कवर करने के लिए जाएं, यह निश्चित रूप से नहीं है। लोड व्यूंट्रोलर के दृश्य के बाद ही;

अजगर

- (void)viewDidAppear:(BOOL)animated { 

[super viewDidAppear:animated]; 

    [self showAlertViewController]; 

} 

- (void)showAlertViewController { 

    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Hello world" message:@"(*  ̄3)(ε ̄ *)d" preferredStyle:UIAlertControllerStyleAlert]; 

    // Create the actions. 

    UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"hello" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) { 
     NSLog(@"The \"Okay/Cancel\" alert's cancel action occured."); 
    }]; 

    UIAlertAction *otherAction = [UIAlertAction actionWithTitle:@"world" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { 
     NSLog(@"The \"Okay/Cancel\" alert's other action occured."); 
    }]; 

    // Add the actions. 
    [alertController addAction:cancelAction]; 
    [alertController addAction:otherAction]; 

    UIWindow *windows = [[UIApplication sharedApplication].delegate window]; 
    UIViewController *vc = windows.rootViewController; 
    [vc presentViewController:alertController animated: YES completion:nil]; 
} 

यह मेरे लिए काम किया है।

+1

हालांकि यह प्रश्न का उत्तर है, क्या आप इसे और समझा सकते हैं? अन्य उपयोगकर्ताओं द्वारा देखी जाने पर यह प्रतिक्रिया उपयोगी नहीं होगी। –

+0

"प्रस्तुत करने" दृश्य नियंत्रक जीवन में पल के आधार पर, आप "प्रस्तुत करने वाले वीसी" के दृश्य को विंडो से "संलग्न" नहीं होने पर चेतावनी नियंत्रक को प्रस्तुत करने का प्रयास कर रहे हैं। मूल रूप से, ViewDidLoad में एक और दृश्य नियंत्रक प्रस्तुत करने का प्रयास नहीं करेगा, जबकि यह ViewDidAppear विधि में पूरी तरह से काम करेगा। – FredericK

3

लाइन बदलें:

UIViewController *vc = self.view.window.rootViewController; 
[vc presentViewController: activityController animated: YES completion:nil]; 
//to 
[self presentViewController:activityController animated: YES completion:nil]; 

या

[self.navigationController pushViewController:activityController animated:YES]; 
+0

धन्यवाद बहुत दोस्त ...मैंने यह जवाब सभी के साथ देखा था ... लेकिन सुनिश्चित करें कि जब आप इन कोडों का उपयोग अपने बड़े उपयोग में करते हैं तो मुख्य कतार से किसी भी बच्चे की कतार से नहीं, अन्यथा दुर्घटनाएं हो सकती हैं –

-7

मैं iPhone 6 + में इसी तरह के मुद्दे का सामना करना पड़ा।

स्विफ्ट 2.0 में

let obj = self.storyboard?.instantiateViewControllerWithIdentifier("navChatController") as! UINavigationController 
    obj.modalPresentationStyle = .FormSheet 
    obj.modalTransitionStyle = .CoverVertical 

    Constants.APPDELEGATE.window?.rootViewController?.presentViewController(obj, animated: false, completion: nil) 

मैं इस तरह से इसे हल।

संबंधित मुद्दे