ऐप

2012-04-13 9 views
6

में पहले दृश्य नियंत्रक पर जाएं मुझे अपने ऐप में पहले दृश्य पर जाना होगा। मेरे पास ढेर पर धक्का दिया गया कुछ विचार है, फिर एक मॉडल नेविगेशन नियंत्रक और उस पर अधिक विचार धक्का दिया।ऐप

मेरी समस्या यह है कि [[self navigationController] popToRootViewControllerAnimated:YES]; का उपयोग केवल मोडल स्टैक में पहले दृश्य पर वापस जाता है।

और मुझे काम करने के लिए [[self navigationController] popToViewController:.. नहीं मिल सकता है क्योंकि वास्तविक पहला दृश्य नियंत्रक [[self navigationController] viewControllers] के साथ एक्सेसिबल नहीं है।

इसे पूरा करने के तरीके पर कोई विचार? धन्यवाद।

+0

कौन सी नेविगेशन नियंत्रक आप कॉल कर रहे हैं? यह नेविगेशन नियंत्रक की जड़ पर चलेगा जिसे मैं कल्पना करता हूं। –

+0

पहले दृश्य नियंत्रक को अपने नेविगेशन के रूटव्यू कंट्रोलर के रूप में बनाएं नियंत्रक –

+0

मोडल व्यू कंट्रोलर बंद करें, फिर रूट पर पॉप करें। – Till

उत्तर

6

यह करें:

[[self navigationController] dismissModalViewControllerAnimated:YES]; 

कि तुम वापस कुलपति कि रीति से नेविगेशन नियंत्रक प्रस्तुत करने के लिए मिल जाएगा। इसके बाद आगे की ओर बढ़ना इस बात पर निर्भर करता है कि आपने नेविगेशन नियंत्रक से पहले उन "कुछ विचारों" को कैसे धक्का दिया था।

संपादित - स्पष्टीकरण गहरी जड़ को पाने के लिए ...

यह उन "कुछ दृश्य" की तरह लगता है अंतर्निहित नेविगेशन नियंत्रक के ढेर दूसरे पर कर रहे हैं। यह थोड़ा मुश्किल हो सकता है, क्योंकि उस ढेर में आगे की ओर जाने का साफ तरीका यह है कि अंतर्निहित नेविगेशन नियंत्रक अपने स्वयं के रूट पर पॉप करता है। लेकिन यह कैसे पता चलेगा कि इसके ऊपर मोडल वीसी किया जाता है?

चलिए दृश्य नियंत्रक को कॉल करें जो दूसरे नेविगेशन नियंत्रक VC_a की मोडल प्रस्तुति करता है। यह एक सामान्य रूप से प्रस्तुत नेविगेशन नियंत्रक है जिसका शीर्ष वीसी वीसी_बी है। VC_a सामान्य रूप से स्वयं को खारिज करते समय VC_a को इसके नेविगेशन रूट पर पॉप करने के बारे में कैसे पता चलेगा?

अच्छा जवाब (आमतौर पर) यह है कि वीसी_बी ने खुद को किसी कारण से खारिज करने का फैसला किया - आपके ऐप/मॉडल में कुछ शर्त इसे करने का फैसला करने के लिए बदल गई।

हम चाहते हैं कि वीसी_ए भी इस स्थिति का पता लगाए। जब VC_b को खारिज कर दिया जाता है, और क्योंकि इसके बारे में पर्दाफाश किया जा करने के लिए है VC_a एक viewWillAppear संदेश हो जाता है:

// VC_a.m 

- (void)viewWillAppear:(BOOL)animated { 

    [super viewWillAppear:animated]; 
    if (/* some app condition that's true when VC_b is done */) { 
     // I must be appearing because VC_b is done, and I'm being uncovered 
     // That means I'm done, too. So pop... 
     [self.navigationController popToRootViewControllerAnimated:NO]; 
    } else { 
     // I must be appearing for the normal reason, because I was just pushed onto the stack 
    } 
} 
+0

मेरी समस्या यह है कि मोडल व्यू कंट्रोलर को खारिज करने से पहले, मेरे पास है इस दृश्य का कोई संदर्भ नहीं है कि इसे पॉपटूट पर बताने के लिए स्टैक के शीर्ष पर होगा। सिंगल मोडल व्यू से पहले अन्य सभी विचारों को PerformSegueWithIdentifier का उपयोग करके पुश संक्रमण के साथ धक्का दिया गया था, उनमें से कोई भी मोडल नहीं है। –

+0

लेकिन जिसने दूसरे नेविगेशन नियंत्रक की मोडल प्रस्तुति की है वह जानता है कि यह कौन है। उस व्यक्ति को पता चलेगा कि एनएवी नियंत्रक को खारिज कर दिया जाता है जब इसे (दूसरा) दृश्य विल्लएपियर मिलता है। वह खुद को पॉप कर सकता है। कृपया मेरा संपादन देखें। – danh

+0

दूसरे शब्दों में, एक को खारिज करने वाला व्यक्ति नहीं जानता कि कौन पॉप करना है, और नहीं करना चाहिए। प्रस्तुत करने वाला एक करता है। – danh

0

आप delegation pattern का उपयोग करके यह करने के लिए की जरूरत है। विशेष रूप से, एक प्रोटोकॉल बनाकर जो प्रतिनिधि की respondsToSelector विधि लागू करता है।

पूर्ण विवरण के लिए this post देखें। यह लगभग वही होना चाहिए जो आप खोज रहे हैं। मुझे कुछ ऐसा करना पड़ा, सिवाय इसके कि मुझे केवल popToRootViewControllerAnimated: का उपयोग करने के बजाय नेविगेशन स्टैक से एक दृश्य को पॉप करने की आवश्यकता थी।

+0

ऐसा लगता है कि यह भी काम करेगा, मैं उपर्युक्त उत्तर पर संपादन से कोड को तेज़ी से कार्यान्वित कर सकता हूं। हालांकि धन्यवाद –

0

AppDelegate.m कक्षा में bellow प्रवाह के साथ विधि बनाने ...

-(void)MethodName{//your method name 
    YourViewController *objViewController = [[[YourViewController alloc] initWithNibName:@"YourViewController" bundle:nil] autorelease]; ///define your viewcontroller name like "FirstViewController" 
    UINavigationController *yourNavigationController = [[[UINavigationController alloc] initWithRootViewController:objViewController] autorelease]; 

    self.window.rootViewController = yourNavigationController; 
} 

आप firstview पर अनुप्रेषित बस AppDelegate वस्तु से इस विधि कॉल चाहते हैं ....

0

iOS6 के लिए ...

[self.view.window.rootViewController dismissViewControllerAnimated:YES completion:nil];