11

से एक दृश्य कैसे हटा सकता हूं मैं एक नया दृश्य नियंत्रक कॉल करना चाहता हूं और नेविगेशन नियंत्रक स्टैक से वर्तमान दृश्य नियंत्रक को हटा सकता हूं। उदाहरण के लिए । मैं देखता हूं नियंत्रक ए और मैं बीमैं नेविगेशन नियंत्रक

अब मेरे पास स्टैक ए, बी में है, अब मैं सी (बी से) को कॉल करना चाहता हूं। मैं चाहता हूं कि ढेर ए, सी

धन्यवाद।

उत्तर

5

यह उत्तर है।

निम्न कोड वर्तमान दृश्य नियंत्रक को पॉप करता है।

UINavigationController *navController = self.navigationController; 
// retain ourselves so that the controller will still exist once it's popped off 
[[self retain] autorelease]; 
[navController popViewControllerAnimated:NO]; 

और यह नया एक धक्का:

ViewControllerC *viewC = [[ViewControllerC alloc] init]; 
[navController pushViewController:viewC animated:TRUE]; 

आशा है कि यह मदद करता है!

+2

एआरसी सक्षम के साथ ऐसा करने का कोई विचार है? कंपाइलर 'retain' – asdasd

+1

@ ऑस्कर के उपयोग को अस्वीकार करता है, मेरा समाधान देखें, [नीचे] (http://stackoverflow.com/a/17328244/1431728)। – JohnK

0

मुझे लगता है कि आप पहले नेविगेशन स्टैक से बी को पॉप करके और फिर सी को दबाकर ऐसा कर सकते हैं। इसके लिए आपको [UINavigationController popViewControllerAnimated] और [UINavigationController pushViewController: एनिमेटेड] का उपयोग करने में सक्षम होना चाहिए।

+0

यह सही है लेकिन पूरा नहीं हुआ। आखिर में यह काम कर रहा था लेकिन मुझे इसे पॉप करने से पहले नियंत्रक को बरकरार रखना है, इसलिए मैं बाद में दूसरे दृश्य को धक्का दे सकता हूं। UINavigationController * navController = self.navigationController; [[आत्मनिर्भर] autorelease]; [navController popViewControllerAnimated: NO]; – Tony

+0

ऐप्पल संदर्भ के अनुसार, http://developer.apple.com/library/ios/#documentation/uikit/reference/UINavigationController_Class/Reference/Reference.html UINavigationController को उप-वर्गीकृत करने का इरादा नहीं है। इतना आसान क्यों इतना जटिल है? – Tony

+0

@ टोनी मेरा बुरा, मैं इसके बारे में भूल गया हूं। मेरी पिछली टिप्पणी को रद्द करें और संपादित करें। मैं उन्हें सभी हटा दूंगा ... – barley

4

दूसरी से-पिछले नेविगेशन आइटम निकालने के लिए:

NSMutableArray *navigationStack = [[NSMutableArray alloc] initWithArray: 
    self.navigationController.viewControllers]; 
[navigationStack removeObjectAtIndex:[navigationStack count] - 2]; 
self.navigationController.viewControllers = navigationStack; 

उदाहरण के लिए, नेविगेशन ढेर से नियंत्रक बी को दूर करने के नियंत्रक सी पर viewDidLoad से चलाते हैं।

23

एआरसी के संदर्भ में, यहाँ एक संभव समाधान है:

NSMutableArray* navArray = [[NSMutableArray alloc] initWithArray:self.navigationController.viewControllers]; 
[navArray replaceObjectAtIndex:[navArray count]-1 withObject:nextViewController]; 
[self.navigationController setViewControllers:navArray animated:YES]; 

आपको बता सकते हैं, यह कोड दृश्य आपको ढेर से दूर करने के लिए कोशिश कर रहे हैं (में हमेशा की तरह धक्का कोड की जगह "बी" आपके प्रश्न में)। लाइन 1 ने एनवी-कंट्रोलर स्टैक से NSMutableArray में व्यू कंट्रोलर की सूची कॉपी की है। लाइन 2 अंतिम (शीर्ष) दृश्य को उस दृश्य के साथ बदलता है जिसे हम अगले ("सी") पर जाना चाहते हैं। लाइन 3 वास्तविक एनवी-कंट्रोलर का ढेर हमारे बदलते सरणी बनता है, और संक्रमण को सबसे ऊपर की वस्तु में एनिमेट करता है।

मैं एक वैकल्पिक तरीका here पाया और एआरसी के लिए यह अनुकूलित (बेशक आप जड़ ViewController में इस कोड का उपयोग नहीं कर सकते।):

UINavigationController *navController = self.navigationController; 
[navController popViewControllerAnimated:NO]; 
[navController pushViewController:someViewController animated:YES]; 

पहली पंक्ति की जरूरत है क्योंकि एक बार आप पॉप गए स्टैक से वर्तमान दृश्य, self.navigationControllernil होगा और तीसरी पंक्ति काम नहीं करेगी। पिछली तरह की रेखाओं की समान संख्या, लेकिन इस तरह ढेर के साथ "मैन्युअल" fiddling के बजाय अंतर्निहित तरीकों के माध्यम से काम करता है।

+0

धन्यवाद आपका दूसरा कार्यान्वयन वही था जो मैं ढूंढ रहा था। – NMunro

+0

धन्यवाद, स्पष्टीकरण उत्कृष्ट है! – Michael

-2

आप इस कोड का उपयोग कर सकते हैं।

एनएसएमयूटेबलएरे * नेविगेशनअरे = [[एनएसएमयूटेबलएरे ऐलोक] initWithArray: self.navigationController.viewControllers]; [नेविगेशनअरे निकालेंऑल ऑब्जेक्ट्स]; self.navigationController.viewControllers = navigationArray;

आशा है कि आपके लिए काम करेगा।

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