视图控制器UINavigationController是iOS编程中比较常用的一种容器view controller。在NavigationController这个容器中,有一个根视图(rootViewController),在根视图的上面进行压栈和弹栈操作。
常用的方法有:
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;
- (nullable UIViewController *)popViewControllerAnimated:(BOOL)animated;
- (nullable NSArray<__kindof UIViewController *> *)popToRootViewControllerAnimated:(BOOL)animated;
其实除了以上三个常用的方法之外还有一个方法是:
- (nullable NSArray<__kindof UIViewController *> *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated;
这个方法是弹到栈中的某个viewcontroller下。
在UINavigationController中有一个属性可以很好的使用以上这个方法,就是viewControllers。
@property(nonatomic,copy) NSArray<__kindof UIViewController *> *viewControllers;
viewControllers是一个数组,这个数组中包含着所有压栈进去的视图,根视图在数组的最底。
例如:
NSInteger count = [self.navigationController.viewControllers count];
UIViewController *vc = [self.navigationController.viewControllers objectAtIndex:count - 2];
[self.navigationController popToViewController:vc animated:YES];
如果多个界面进行中有循环跳转问题:可以将viewcontrollers这个数组进行修改栈内的视图,从而解决循环跳转问题。
例如:
NSMutableArray * controllers = [NSMutableArray arrayWithArray:self.navigationController.viewControllers]
[controllers removeObjectsInRange:NSMakeRange(i, controllers.count-i-1)]
[controllers insertObject:RTOrderViewC atIndex:controllers.count-1]
self.navigationController.viewControllers = controllers
以上由本人总结所得,如有错误请指出。谢谢!