如何从导航控制器ios中删除上一个视图控制器?



我想从导航堆栈中删除以前的视图控制器。

例如

-> A 是根视图。现在

导航到 B - B 导航到 C - C 导航到 C - C 导航到 C -->现在我想删除所有 C 视图控制器并弹出到 B

B 不是修复视图控制器。

另一个例子

A -> b -> c> g> c> f> c> c

> c>c

从导航中删除所有c视图控制器并需要以下输出

A -> b -> c>

g> c> f

请帮助我

从导航堆栈中识别控制器。并弹出到该控制器

  NSArray *viewControllers = [[self navigationController] viewControllers];
  int count = [viewControllers count];
  for (int i= count-2; i >= 0 ; i--) {
        id obj=[viewControllers objectAtIndex:i];
        if(![obj isKindOfClass:[C class]]){
           [[self navigationController] popToViewController:obj animated:YES];
            return;
        }
   }

您可以使用popToViewController(https://developer.apple.com/documentation/uikit/uinavigationcontroller/1621871-poptoviewcontroller(。

例:

在目标C中

[self.navigationController popToViewController:self.navigationController.viewControllers[your_VC_index] animated: true]; 
// in first eg your_VC_index will be 1 and another example it will be 5

在斯威夫特 3 中

self.navigationController.popToViewController( self.navigationController.viewControllers[your_VC_index], animated: true)

反向迭代导航堆栈并获取第一个不匹配的视图控制器的索引,然后获取popToViewController

if let controllers = self.navigationController?.viewControllers {
   var count = controllers.count - 1
   for viewcontroller in controllers.reversed() {
       if viewcontroller is CViewController {
          count -= 1
       } else {
          break
       }
    }
    let vc = controllers[count]
    self.navigationController?.popToViewController(vc, animated: true)
 }

编写如下所示的方法,

- (void)removeAllLastCObjectsFromNavigationController {
    //fetch viewcontroller array. for your case which will be A - > b -> c > g > c > f > c > c > c > c
    NSArray *viewControllers = yourNavigationController.viewControllers;
    NSMutableArray *mutableArray = [NSMutableArray arrayWithArray: viewControllers];
    while(1) {
        id viewController = mutableArray.lastObject;
        if ([viewController isKindOfClass:[YourCClassName class]]) {
            //Now continue removing the objects from the array if that is C type object.
            [mutableArray removeLastObject];
        } else {
            //If found any other class than C stop removing viewcontroller
            break;
        }
    }
    //Now mutableArray contains A - > b -> c > g > c > f
    yourNavigationController.viewControllers = mutableArray;
}

因为 navigationController 的 childViewController 是一个堆栈,
所以使用这个函数可以弹出到 f viewController 而 "c> c> c> c"被销毁。

for (UIViewController *tempVC in self.navigationController.childViewControllers) {
    if ([tempVC isKindOfClass:[fViewController class]]) {
        fViewController *f = (fViewController *)tempVC;
        [self.navigationController popToViewController:f animated:YES];
    }
}

但是,如果您不想弹出到 f,只想获取导航控制器的新子视图控制器。 您可以使用下一个函数:

for (UIViewController *tempVC in self.navigationController.childViewControllers) {
    if ([tempVC isKindOfClass:[ScanViewController class]]) {
        NSUInteger findex = [self.navigationController.childViewControllers indexOfObject:tempVC];
        NSMutableArray *viewArray = [NSMutableArray arrayWithArray:self.navigationController.childViewControllers];
        [viewArray removeObjectsInRange:NSMakeRange(findex, viewArray.count - 1)];
    }
}

viewArray 是新的 childViewControllers。如果您有新的需求,可以编辑此函数然后使用它。

最新更新