导航通过类名返回指定页面
项目中我们经常会用到导航,常见的问题就是返回到指定的页面,但是系统的方法是需要传入一个对象,如何通过类名来返回指定页面呢?
- (nullable NSArray<__kindof UIViewController *> *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated; // Pops view controllers until the one specified is on top. Returns the popped controllers.
原理:利用UINavigationController的viewControllers属性,循环查找,再跳转指定对象
@property(nonatomic,copy) NSArray<__kindof UIViewController *> *viewControllers; // The current view controller stack.
有下面三种情况需要考虑
A、栈里是不同的类创建的对象
B、在栈里有同一个类创建的两个对象,返回到先创建的对象
C、在栈里有同一个类创建的两个对象,返回到后创建的对象
话不多说直接上代码
- (void)popToViewControllerClass:(Class) targetClass{ if ([targetClass respondsToSelector:@selector(alloc)]){ UINavigationController* navC = (UINavigationController*)([self isKindOfClass:UINavigationController.class] ? self : self.navigationController); // A&B // for (UIViewController *vc in navC.viewControllers){ // if ([vc isKindOfClass:targetClass]){ // [navC popToViewController:vc animated:YES]; // return; // } // } // C // 1、 倒叙数组+forin循环 // NSArray<__kindof UIViewController *> *reversStackArray = [[navC.viewControllers reverseObjectEnumerator] allObjects]; // for (UIViewController *vc in reversStackArray){ // if ([vc isKindOfClass:targetClass]){ // [navC popToViewController:vc animated:YES]; // return; // } // } // 2、 枚举器+while循环 NSEnumerator *enumerator = [navC.viewControllers reverseObjectEnumerator]; id obj = nil; while (obj = [enumerator nextObject]) { if ([obj isKindOfClass:targetClass]){ [navC popToViewController:obj animated:YES]; return; } } } }