iphone - मैं एक नेविगेशन नियंत्रक से एक बार में दो विचार कैसे पॉप करूं?




ios uinavigationcontroller (11)

आप popToRootViewControllerAnimated साथ "रूट" (पहले) दृश्य नियंत्रक पर पॉप कर सकते popToRootViewControllerAnimated :

[self.navigationController popToRootViewControllerAnimated:YES];

// If you want to know what view controllers were popd:
// NSArray *popdViewControllers = [self.navigationController popToRootViewControllerAnimated:YES];

UINavigationController संदर्भ :

रूट व्यू कंट्रोलर को छोड़कर स्टैक पर सभी व्यू कंट्रोलर को पॉप करता है और डिस्प्ले अपडेट करता है।

प्रतिलाभ की मात्रा
स्टैक से पॉप किए गए दृश्य नियंत्रकों की एक सरणी।

मैं नेविगेशन स्टैक पर पहले दृश्य में तीसरे दृश्य पर पॉप करना चाहता हूं।

मुझे पता है कि एक बार में एक बार कैसे पॉप करना है:

[self.navigationController popViewControllerAnimated:YES];

लेकिन मैं एक बार में दो कैसे करूँ?

धन्यवाद...


आप इस तरह कुछ कोशिश कर सकते हैं:

तीव्र

var viewControllers = navigationController?.viewControllers
viewControllers?.removeLast(2) // views to pop
navigationController?.setViewControllers(viewControllers!, animated: true)

उद्देश्य सी

int viewsToPop = 2;
[self.navigationController popToViewController: self.navigationController.viewControllers[self.navigationController.viewControllers.count-viewsToPop-1] animated:YES];

आप नेविगेशन नियंत्रक स्टैक के बीच भी कूदने के लिए इसे आजमा सकते हैं

NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray:[self.navigationController viewControllers]];
for (UIViewController *aViewController in allViewControllers) {
    if ([aViewController isKindOfClass:[RequiredViewController class]]) {
        [self.navigationController popToViewController:aViewController animated:NO];
    }
}

आप प्रारंभिक दृश्य नियंत्रक (जिसे आप वापस आना चाहते हैं) पास कर सकते हैं और फिर अंतिम पंक्ति में इस पंक्ति को कॉल कर सकते हैं:

[self.navigationController popToViewController:yourInitialViewController animated:YES];

एल


एक्स व्यू कंट्रोलर वापस जाने के लिए मैं एक छोटा सा फ़ंक्शन उपयोग कर रहा हूं:

-(void)backMultiple:(id)data {
    int back = 2; //Default to go back 2 
    int count = [self.navigationController.viewControllers count];

    if(data[@"count"]) back = [data[@"count"] intValue];

    //If we want to go back more than those that actually exist, just go to the root
    if(back+1 > count) {
        [self.navigationController popToRootViewControllerAnimated:YES];
    }
    //Otherwise go back X ViewControllers 
    else {
        [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:count-(back+1)] animated:YES];
    }
}

मुझे यह जवाब यहां नहीं मिला। यदि आप केवल कुछ (रूट के लिए सभी तरह से नहीं) को पॉप करना चाहते हैं, तो आप केवल self.navigationController.view नियंत्रकों द्वारा कक्षा प्रकारों की जांच कर सकते हैं, या यदि आपके पास कोई संदर्भ उपयोग है तो:

for (UIViewController *aViewController in self.navigationController.viewControllers) {
   if ([aViewController isKindOfClass:[SMThumbnailViewController class]]) {
      [self.navigationController popToViewController:aViewController animated:YES];
   }
}

स्विफ्ट 2 - एक्सकोड 7.3

यह UIViewControllers पॉप करने के लिए एक बहुत उपयोगी विस्तार हो सकता है:

extension UINavigationController {

    func popToViewControllerOfType(classForCoder: AnyClass) {
        for controller in viewControllers {
            if controller.classForCoder == classForCoder {
                popToViewController(controller, animated: true)
                break
            }
        }
    }

    func popViewControllers(controllersToPop: Int, animated: Bool) {
        if viewControllers.count > controllersToPop {
            popToViewController(viewControllers[viewControllers.count - (controllersToPop + 1)], animated: animated)
        } else {
            print("Trying to pop \(controllersToPop) view controllers but navigation controller contains only \(viewControllers.count) controllers in stack")
        }
    }
}

स्विफ्ट संस्करण (स्विफ्ट 1.2 / एक्सकोड 6.3.1) के रूप में दो बार या अधिक पॉपिंग के रूप में

 var viewControllers = self.navigationController?.viewControllers
 viewControllers?.removeLast()
 viewControllers?.removeLast()
 self.navigationController?.setViewControllers(viewControllers, animated: true)

या

 var viewControllers = self.navigationController?.viewControllers
 var viewsToPop = 2
 var end = (viewControllers?.count)!
 var start = end - viewsToPop
 viewControllers?.removeRange(Range<Int>(start: start, end: end))
 self.navigationController?.setViewControllers(viewControllers, animated: true)

स्विफ्ट 3 में , आप उस तरह नेविगेशन नियंत्रक से एक, दो या अधिक व्यू कंट्रोलर पॉप कर सकते हैं

let viewControllers = self.navigationController!.viewControllers as [UIViewController]
    for aViewController:UIViewController in viewControllers {
        if aViewController.isKind(of: FromWhereYouWantToGoController.self) {
            _ = self.navigationController?.popToViewController(aViewController, animated: true)
        }
    }

यहां से WHWYouWantToGoController गंतव्य नियंत्रक है। आशा करता हूँ की ये काम करेगा।


    NSMutableArray *newStack = [NSMutableArray arrayWithArray:[self.navigationController viewControllers]];
    [newStack removeLastObject];
    [newStack removeLastObject];
    [self.navigationController setViewControllers:newStack animated:YES];

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];   

objectAtIndex: 1 -> आप जिस भी इंडेक्स को पॉप करना चाहते हैं उसे पास कर सकते हैं





pop