0

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

BaseView.NavigationController.ViewControllers

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

在某些时候,我的一个项目会从 BaseView.NavigationController.ViewControllers 中删除,即使它仍然是一个有效的视图控制器并且 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?

4

1 回答 1

0

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

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

而不是使用该IsViewLoaded属性,您应该检查 View Controller 是否存在于NavigationController.ViewControllers数组中,如果存在则 Pop 到它,如果不存在则推送它。

例如

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

编辑

因此,您提到您希望视图保留在导航堆栈上。那么,使用 PopToViewController 将删除TopViewController 和指定控制器之间的所有视图控制器。

为了实现您想要的,您可以直接操作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]};
于 2012-11-25T02:55:28.137 回答