如何从UINavigationController堆栈中删除特定的视图控制器?

30

我有一个UINavigationController。 登录后,我想从UInavigationcontroller堆栈中删除RegisterViewController、LoginViewController等视图控制器。

我的意思是我要从堆栈中删除特定的视图控制器?这怎么可能呢?

我查看了这篇文章。

http://starterstep.wordpress.com/2009/03/05/changing-a-uinavigationcontroller’s-root-view-controller/

那么我们可以将其放入一个数组中,如下:

NSArray *allviewcontrollers= [(UINavigationController *)navigationController viewControllers];

但是如何进行进一步的处理...这个问题困扰我很长时间了...请回答我...提前感谢。

2个回答

86
NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray: navigationController.viewControllers];
[allViewControllers removeObjectIdenticalTo: removedViewController];
navigationController.viewControllers = allViewControllers;

1
在你的代码中,你使用+alloc和-initWithNibName:bundle:创建了一个LoginViewController。这可能是你的应用程序委托,我不知道你的应用程序是如何架构的。无论如何,要可靠地删除控制器,您必须保留对它的引用(例如,在应用程序委托中作为ivar)。上面片段中的“removedViewController”就是该引用。是的,您可以遍历查找特定类的控制器的视图控制器数组。但是,如果有一天您扩展应用程序并拥有两个或三个控制器怎么办?我的意见。 - Costique
1
我知道你的方法是从uinavigation堆栈中删除viewcontroller的最佳方式。我对objective c非常陌生,所以对“对象引用”感到困惑。我尝试了这个..[allViewControllers removeObjectIdenticalTo: myDelegate.nonLogginedViewController];在我的Appdelegate中,我写了@property (nonatomic, retain) NonLogginedViewController *nonLogginedViewController;和 @synthesize nonLogginedViewController;只需要保留对nonLogginedViewController的引用吗? 提前致谢。 - S.P.
4
这个方法可以使用,但建议在视图控制器正在进行推入或弹出动画时避免使用。你会得到这样的日志:"在意料之外的状态下完成导航过渡。导航栏子视图树可能会损坏。" - Johan Kool
我也是这样做的,但是出现了一个错误,如下所示:“在意料之外的状态下完成导航转换。导航栏子视图树可能会损坏。” - Dev
这在某种程度上是有效的。导航项堆栈不会受到影响。当按下“返回”时,您将获得具有以此方式删除的视图的标题的视图控制器。为了避免这种情况,只需使用pop和push(如果必要,弹出所有内容并仅推回您想要的内容,而不进行动画处理)。 - Radu Simionescu
显示剩余4条评论

1

这是我的解决方案。你可以为你的视图控制器设置标签或固定属性,然后遍历uinavigationcontroller堆栈以搜索目标视图控制器(vcToRemove)并将其移除。这样会更加安全。代码:

NSInteger tag = vcToRemove.wvTag;
NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray: vcToRemove.navigationController.viewControllers];
        int i = 1;
        for (i = 1; i <=[allViewControllers count]; i++) {
            UIViewController *vc = [allViewControllers objectAtIndex:i];
            if ([vc isKindOfClass:[MyWebViewController class]]) {
                if (((MyWebViewController *)vc).wvTag == tag) {
                    [allViewControllers removeObjectAtIndex:i];
                    break;
                }
            }
        }

        vcToRemove.navigationController.viewControllers = allViewControllers;

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