视图控制器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; // The current view controller stack
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;
以上由本人总结所得,如有错误请指出。谢谢!