UINavigationController 跳转那点事

2,329 阅读1分钟

视图控制器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

以上由本人总结所得,如有错误请指出。谢谢!