为什么我的ViewController被从NavigationController.ViewControllers集合中删除

时间:2012-11-25 01:19:00

标签: ios xamarin.ios

我在iOS应用程序的屏幕之间导航。

BaseView.NavigationController.ViewControllers

当我切换屏幕时,我在静态变量中保留对前一个屏幕的引用。

在某些时候,我的一个项目会从BaseView.NavigationController.ViewControllers中删除,即使它仍然是一个有效的viewcontroller并且IsLoaded仍然设置为True / YES。

当我使用时(原谅我的C#/ MonoTouch)

BaseView.NavigationController.PopToViewController(CurrentViewController,false); 

再次显示它,我得到NSInternalInconsistencyException原因:试图弹出到不存在的视图控制器。这是可以理解的,因为它不再出现在ViewController集合中。

我切换屏幕的方式是我保留对各种屏幕的引用并调用显示屏幕的常用方法。在那个方法中,我使用这个逻辑来确定我是应该推还是弹出。

        if (CurrentViewController.IsViewLoaded)
        {

            BaseView.NavigationController.PopToViewController(CurrentViewController,false);
        }
        else
        {
            BaseView.NavigationController.PushViewController(CurrentViewController,true);
        }

我的问题是它去了哪里以及为什么它会从ViewControllers集合中删除,当它的StillLoaded = true / YES时?

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您使用NavigationController.PopToViewController(controller);导航回某个视图控制器,但保留从导航堆栈弹出的视图控制器的引用。

我认为发生的事情是因为你保留了对这些视图控制器的引用,它们仍在内存中,因此IsViewLoaded属性仍为true,尽管View Controller实际上并不存在在导航堆栈上。

不应使用IsViewLoaded属性,而应检查视图控制器是否存在于NavigationController.ViewControllers数组中,如果确实存在则弹出它,如果不存在则推送它。

E.g。

if (BaseView.NavigationController.ViewControllers.Contains(CurrentViewController))
{
    BaseView.NavigationController.PopToViewController(CurrentViewController,false);
}
else
{
    BaseView.NavigationController.PushViewController(CurrentViewController,true);
}

修改

所以你提到你想要一个坚持导航堆栈的视图。好吧,使用PopToViewController将删除TopViewController和指定Controller之间的 ALL 视图控制器。

为了达到你想要的效果,你可以直接操作NavigationControllers.ViewControllers数组。唯一的问题是你将失去Push / Pop方法提供的漂亮动画。

// Changes order of View Controllers currently in the stack. You can also add/remove 
// controllers using this method.
NavigationController.ViewControllers = new UIViewController[]{
          NavigationController.ViewControllers[1],
          NavigationController.ViewControllers[0],
          NavigationController.ViewControllers[3],
          NavigationController.ViewControllers[2]};