2012-04-04 17 views
45

मेरे पास स्टोरीबोर्ड पर एक दृश्य है जिसमें एक निश्चित कार्रवाई करने के लिए एक बटन है। हालांकि, इस क्रिया को करने के लिए, उपयोगकर्ता को लॉग इन होना चाहिए। बटन हैंडलर परीक्षण यदि उपयोगकर्ता लॉग इन होता है और यदि कोई और यदि कोई है तो एक सेग्यू करता है। कोई segues लॉगिन दृश्य नियंत्रक को धक्का नहीं देता है। पहले दृश्य नियंत्रक को वापस जोड़ने वाला एक और सेग्यू है, इसलिए यदि लॉगिन सफल होता है तो उपयोगकर्ता इसे छोड़कर उठा सकता है। दृश्य नियंत्रक एक नेविगेशन नियंत्रक में एम्बेडेड हैं।एक UIViewController पर वापस segue कैसे करें जो पहले ही लोड हो चुका है?

समस्या यह है कि 'रिटर्न' सेग्यू व्यू कंट्रोलर का एक नया नया उदाहरण लोड कर रहा है और मूल उदाहरण को संदर्भित नहीं कर रहा है, इसलिए मैं खाली इंटरफ़ेस तत्वों और स्मृति में उस दृश्य नियंत्रक की 2 प्रतियों के साथ समाप्त होता हूं।

मैं दृश्य नियंत्रक के मूल उदाहरण पर वापस कैसे जा सकता हूं?

उत्तर

135

"push" के उपयोग से मानते हुए आपका मतलब है कि आप UINavigationController का उपयोग कर रहे हैं, तो आप स्टैक के शीर्ष पर वापस जाने के लिए निम्न का उपयोग कर सकते हैं।

[self.navigationController popToRootViewControllerAnimated:YES]; 

या

UIViewController *prevVC = [self.navigationController.viewControllers objectAtIndex:<n>]; 
[self.navigationController popToViewController:prevVC animated:YES]; 

एक विशिष्ट स्तर जहां <n> स्तर है पॉप।

या

[self.navigationController popViewControllerAnimated:YES]; 

आप बस एक स्तर वापस ऊपर नेविगेशन ढेर पॉप चाहते हैं।

+1

मेरे पास एक UIBarButton है जो प्रारंभ में पिछली स्क्रीन में ViewDidLoad में लोड किया गया है (जिसे हम वापस जा रहे हैं)। जब मैं आपके कोड का उपयोग करता हूं, तो UIBar बिल्कुल नहीं दिखाता है। कोई विचार क्यों? – c0d3Junk13

33

पिछले नियंत्रक पर वापस जाने के लिए एक सेग्यू का उपयोग करने के बजाय आपको उस दृश्य का उपयोग करना चाहिए जो वर्तमान दृश्य नियंत्रक को अस्वीकार कर देता है (यदि सीगू मोडल था) या नेविगेशन नियंत्रक से इसे पॉप करें (अगर segue धक्का दिया गया था) और पिछले नियंत्रक स्वचालित रूप से दिखाएगा।

उदाहरण के लिए, यदि आपके लॉगिन स्क्रीन पर बटन दबाए जाने पर मोडल सेग्यू वापस किया जा रहा था, तो आप स्टोरीबोर्ड से सेग्यू को हटाएं और उस बटन के अंदर टच अप करें जिसे आप अपनी क्रिया से लिंक करते हैं , पर सफल प्रवेश कॉल करेगा:

[self dismissViewControllerAnimated:YES completion:nil]; 

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

यदि आपने लॉगिन दृश्य को नेविगेशन नियंत्रक पर धक्का दिया है, तो आपको इसे स्टैक से पॉप करना होगा (यदि पिछले दृश्य पर वापस जा रहा है)। इनमें से किसी एक का उपयोग करें:

[[self navigationController] popViewControllerAnimated:YES]; // goes back to previous view 
[[self navigationController] popToViewController: myViewControllerAfterLogin animated:YES]; // goes back to specific view on stack. 
[[self navigationController] popToRootViewControllerAnimated:YES]; // goes back to first view on the stack 

एनिमेटेड संक्रमण segue पर इस्तेमाल किया संक्रमण के प्रकार रिवर्स चाहिए, ताकि नीचे curled जाएगा जब आप दृश्य को खारिज सिकुड़कर।

+0

यदि आप एक कस्टम सेग्यू का उपयोग कर रहे हैं, जैसे पुश सेग्यू के लिए गैर स्लाइड प्रभाव, पॉप आपके कस्टम सेग्यू के विपरीत नहीं होगा, बल्कि सिर्फ एक स्लाइड प्रभाव होगा। – nenchev

2

malhal सही है - यह अपने लिंक पर क्लिक करने के लायक है।

कोड ऐप्पल के उदाहरण से थोड़ा आगे बढ़ गया है और यह भी अधिक लचीला है। मेरे पास तीन दृश्य हैं लेकिन केवल एक कस्टम व्यू कंट्रोलर। एम फ़ाइल है। मैं एक नेविगेशन ढेर नहीं चाहता था। बाद के दृश्यों तक पहुंच बटन से segues द्वारा है। मैं आधार दृश्य नियंत्रक मीटर फ़ाइल में इस लाइन कहा:

- (IBAction)unwindForSegue:(UIStoryboardSegue *)unwindSegue towardsViewController:(UIViewController *)subsequentVC{} 

फिर तीसरे दृश्य मैं में बाहर निकलने के आइकन के लिए एक बटन से नियंत्रित-घसीटा और तनाव मुक्त कार्रवाई का चयन किया। यह अब एक दृश्यव्यू कंट्रोलर विधि को कॉल करने की आवश्यकता के बिना दृश्य 3 से वापस दृश्य 2 पर वापस आ जाता है।

+0

मुझे लगता है कि आखिरी चीज जिसे मैंने अंततः समझा था वह यह था कि यह आपके स्टैक को तब तक खोल देगा जब तक यह एक नियंत्रक तक नहीं पहुंच जाता है जो आपके द्वारा उपयोग किए जा रहे विशिष्ट निकास सेगमेंट से जुड़े अवांछित क्रिया को लागू करता है। तो आप विभिन्न निकास कार्यों के साथ कई निकास segues परिभाषित कर सकते हैं, और फिर आप प्रत्येक segues के लिए, जहां आप भूमि पर जाना चाहते हैं, में विशिष्ट अनइंड कार्रवाई को लागू करते हैं। –