从导航栈中移除ViewController

3

我用代码完成这个任务:

NSArray *viewControllersFromStack = [self.navigationController viewControllers];
NSMutableArray *viewControllersFromStackMutable = [NSMutableArray arrayWithArray:viewControllersFromStack];
NSMutableArray *viewControllersToRemove = [[NSMutableArray alloc]init];

for (UIViewController *currentVC in viewControllersFromStack)
{
    if ([currentVC isKindOfClass:[TalksViewController class]])
    {
        [viewControllersToRemove addObject:currentVC];
        if (viewControllersToRemove.count == 2)
        {
            UIViewController *oneVCtoRemove = [viewControllersToRemove objectAtIndex:0];
            [viewControllersFromStackMutable removeObject:oneVCtoRemove];
            [self.navigationController setViewControllers:viewControllersFromStackMutable];

        }
    }
}

问题是我在导航栏中引用了已删除的视图控制器。如何解决?

2个回答

2
当你想要从导航栈中移除一个视图时,你可以简单地在导航栏上调用这个方法来弹出视图:
[self.navigationController popViewControllerAnimated:YES];

使用以下代码弹出外部视图:

for(UIViewController *currentVC in viewControllersFromStack)
{
    if([currentVC isKindOfClass:[TalksViewController class]])
    {
        [currentVC.navigationController popViewControllerAnimated:YES];
    }
}

那我不是很明白这个问题,能否再提供更多的细节说明呢? - Gergy008
7
你能否告诉全世界你是如何解决这个问题的,以便其他人也遇到相同问题时可以参考? :-) - Gergy008
这段代码弹出了堆栈中的_top_视图控制器,因此如果类TalksViewController的视图控制器不在顶部,则会弹出错误的视图控制器。 - Alex the Ukrainian

0

上面的回答是正确的。

我将'A'设置为根视图控制器。'B到F'是其他视图控制器。如果我想直接从'F'转到'A',请按以下步骤进行。

[self.navigationController popToRootViewControllerAnimated:YES];

但是,如果我想要跳转到'B',那么答案中的代码是有帮助的。我只需将视图控制器数组更改为使用'reverseObjectEnumerator'进行反向运行,并使用'popViewControllerAnimated:NO'将动画设置为NO。代码如下:

NSArray *viewControllersFromStack = [self.navigationController viewControllers];
for(UIViewController *currentVC in [viewControllersFromStack reverseObjectEnumerator])
{
    if(![currentVC isKindOfClass:[A class]] && ![currentVC isKindOfClass:[B class]])
    {
        [currentVC.navigationController popViewControllerAnimated:NO];
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接