iOS-移除navigationController栈中某一个viewController

今天遇到一个问题,就是从A---->B---->C,其中A和C页面都有接口请求,B页面没有接口请求;因此修改了C页面的值后,返回到上一级页面B,导致数据没同步。刚开始的想法有两种:1、我直接返回到A界面;2、后台给我B面增加接口,但是快上版了来不及了。刚开始的想法是用如下方法,这样有一个缺陷,就是我有很多页面需要到C页面,因此要增加判断,如果跳转的页面多了就很麻烦了

for (UIViewController *controller in self.navigationController.viewControllers) {
                if ([controller isKindOfClass:[指定viewController class]]) {
                    [self.navigationController popToViewController:vc animated:YES];
                }
            }

因此我改变了策略,就是删除其中一个viewController-B页面的想法,即在一个导航控制器中跳过某一个vc而pop到更前面的vc去。首先尝试着在navigationController的所有方法中寻找removeXXX的方法或者deleteXXX的方法,但是翻遍navigationController的头文件也没有类似的方法,原来self.navigationController.viewControllers是一个不可变数组。因此我在B跳转到C界面之后,

OC调用如下方法:

NSMutableArray *naviVCsArr = [[NSMutableArray alloc]initWithArray:self.navigationController.viewControllers];
        for (UIViewController *vc in naviVCsArr) {
            if ([vc isKindOfClass:[当前控制器 class]]) {
                [naviVCsArr removeObject:vc];
                break;
            }
        }
        self.navigationController.viewControllers = naviVCsArr;

记得break;否则会出一些小问题 。

若用self removeFromParentViewController这个方法,但是会出现小得问题就放弃使用了。返回后当前的导航栏没变,会是返回前的控制器的导航栏

Swift实现方法如下:

// 1.先Push到新的控制器,在删除当前控制器
        //2. 导航栏剔除当前控制器
        let naviVCsArr = NSMutableArray.init(array: (self.navigationController?.viewControllers)!)
        for vc in naviVCsArr {
            if (vc as! UIViewController).classForCoder == 当前控制器.self  {
                naviVCsArr.remove(vc)
                break;
            }
        }
        self.navigationController?.viewControllers = arrayVC as! [UIViewController];


你可能感兴趣的:(iOS-OC)