मैं पहले दृश्य पर वापस नेविगेशन स्टैक पर तीसरे दृश्य को पॉप करना चाहता हूं।
मुझे पता है कि एक बार में एक दृश्य को कैसे पॉप किया जाए:
[self.navigationController popViewControllerAnimated:YES];
लेकिन मैं एक बार में दो कैसे करूँ?
मैं पहले दृश्य पर वापस नेविगेशन स्टैक पर तीसरे दृश्य को पॉप करना चाहता हूं।
मुझे पता है कि एक बार में एक दृश्य को कैसे पॉप किया जाए:
[self.navigationController popViewControllerAnimated:YES];
लेकिन मैं एक बार में दो कैसे करूँ?
जवाबों:
आप नेविगेशन नियंत्रक स्टैक के बीच भी कूदने के लिए इसे आज़मा सकते हैं
NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray:[self.navigationController viewControllers]];
for (UIViewController *aViewController in allViewControllers) {
if ([aViewController isKindOfClass:[RequiredViewController class]]) {
[self.navigationController popToViewController:aViewController animated:NO];
}
}
यहां दो UINavigationController
एक्सटेंशन दिए गए हैं जो आपकी समस्या को हल कर सकते हैं। मैं पहले UIViewController
एक विशेष वर्ग के लिए चबूतरे का उपयोग करने की सलाह दूंगा :
extension UINavigationController {
func popToViewController(ofClass: AnyClass, animated: Bool = true) {
if let vc = viewControllers.filter({$0.isKind(of: ofClass)}).last {
popToViewController(vc, animated: animated)
}
}
func popViewControllers(viewsToPop: Int, animated: Bool = true) {
if viewControllers.count > viewsToPop {
let vc = viewControllers[viewControllers.count - viewsToPop - 1]
popToViewController(vc, animated: animated)
}
}
}
और इसे इस तरह उपयोग करें:
// pop to SomeViewController class
navigationController?.popToViewController(ofClass: SomeViewController.self)
// pop 2 view controllers
navigationController?.popViewControllers(viewsToPop: 2)
removeLast
को बस के साथ बदल सकते हैं removeLast(2)
।
let vc = viewControllers[viewControllers.count - viewsToPop + 1]
, सही ढंग से काम करने के लिए आपको इसे बदलने की आवश्यकता है: let vc = viewControllers[viewControllers.count - (viewsToPop + 1)]
याlet vc = viewControllers[viewControllers.count - viewsToPop - 1]
आप "रूट" (पहले) दृश्य नियंत्रक के साथ पॉप कर सकते हैं popToRootViewControllerAnimated
:
[self.navigationController popToRootViewControllerAnimated:YES];
// If you want to know what view controllers were popd:
// NSArray *popdViewControllers = [self.navigationController popToRootViewControllerAnimated:YES];
UINavigationController
संदर्भ :
रूट दृश्य नियंत्रक को छोड़कर स्टैक पर सभी व्यू कंट्रोलर्स को प्रदर्शित करता है और डिस्प्ले को अपडेट करता है।
मान वापस लौटें
व्यू व्यूअर की एक सरणी जो स्टैक से पॉप अप की जाती है।
स्विफ्ट 2 - xCode 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")
}
}
}
यदि आप केवल एक बार में 2 पॉप करना चाहते हैं क्योंकि आपका rootViewController (तरीका) 'गहरा' है, तो 2 आप उदाहरण के लिए UIviewController में एक श्रेणी जोड़ने पर विचार कर सकते हैं:
#import <UIKit/UIKit.h>
@interface UINavigationController (popTwice)
- (void) popTwoViewControllersAnimated:(BOOL)animated;
@end
#import "UINavigationController+popTwice.h"
@implementation UINavigationController (popTwice)
- (void) popTwoViewControllersAnimated:(BOOL)animated{
[self popViewControllerAnimated:NO];
[self popViewControllerAnimated:animated];
}
@end
#import "UINavigationController+popTwice.h"
अपने कार्यान्वयन में श्रेणी को कहीं आयात करें और कोड की इस पंक्ति का उपयोग एक ही बार में 2 नियंत्रकों को पॉप करने के लिए करें:
[self.navigationController popTwoViewControllersAnimated:YES];
क्या यह महान नहीं है? :)
स्विफ्ट 4:
func popViewControllerss(popViews: Int, animated: Bool = true) {
if self.navigationController!.viewControllers.count > popViews
{
let vc = self.navigationController!.viewControllers[self.navigationController!.viewControllers.count - popViews - 1]
self.navigationController?.popToViewController(vc, animated: animated)
}
}
फिर इस विधि का उपयोग करें
self.popViewControllerss(popViews: 2)
//viewIndex = 1;
//viewIndex = 2;
//viewIndex = 3;
// **[viewControllers objectAtIndex: *put here your viewindex number*]
NSArray *viewControllers = [self.navigationController viewControllers];
[self.navigationController popToViewController:[viewControllers objectAtIndex:viewIndex] animated:NO];
NSMutableArray *newStack = [NSMutableArray arrayWithArray:[self.navigationController viewControllers]];
[newStack removeLastObject];
[newStack removeLastObject];
[self.navigationController setViewControllers:newStack animated:YES];
स्विफ्ट 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)
}
}
यहाँ FromWhereYouWantToGoController गंतव्य नियंत्रक है। आशा करता हूँ की ये काम करेगा।
मुझे यह उत्तर यहां नहीं दिखाई दिया। यदि आप केवल कुछ पॉप करना चाहते हैं (रूट के सभी तरीके नहीं), तो आप बस self.navigationController.viewControllers के माध्यम से वर्ग प्रकारों के लिए जाँच कर सकते हैं, या यदि आपके पास एक संदर्भ उपयोग है:
for (UIViewController *aViewController in self.navigationController.viewControllers) {
if ([aViewController isKindOfClass:[SMThumbnailViewController class]]) {
[self.navigationController popToViewController:aViewController animated:YES];
}
}
यहाँ एक छोटा सा कार्य है जो मैं X ViewControllers पर वापस जाने के लिए उपयोग कर रहा हूँ:
-(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];
}
}
दो बार या अधिक पॉपिंग के स्विफ्ट संस्करण (स्विफ्ट 1.2 / Xcode 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)
आप UIViewControllers के स्टैक का उपयोग कर सकते हैं। 1. स्टैक में सभी viewControllers की सरणी प्राप्त करें। 2. मैं पूरे व्यू के माध्यम से पढ़ता हूं और
क्लास के प्रकार का मिलान करके वांछित व्यू कंट्रोलर ढूंढता हूं । 3. ViewController पॉप।
func popToSpecificViewC
{
let viewControllers: [UIViewController] = self.navigationController!.viewControllers as [UIViewController];
for viewController:UIViewController in viewControllers
{
if viewController.isKind(of: WelcomeViewC.self)
{
_ = self.navigationController?.popToViewController(viewController, animated: true)
}
}
}
एक साधारण UINavigationController एक्सटेंशन का उपयोग करना :
extension UINavigationController {
func popViewControllers(_ count: Int) {
guard viewControllers.count > count else { return }
popToViewController(viewControllers[viewControllers.count - count - 1], animated: true)
}
}