弹出查看控制器

Posted

技术标签:

【中文标题】弹出查看控制器【英文标题】:pop To View Controller 【发布时间】:2014-05-23 21:34:06 【问题描述】:

我是 Objective-C 编码的新手,我正在尝试使用 pop to viewController。要在点击按钮时执行此操作,我使用

[self.navigationController popToViewController:(what goes here) animated:YES];

我知道它是一个UIViewController*,但我想知道我在哪里声明它以及我将使用什么代码来声明它。

我的基本情节提要是我有 4 个视图控制器 A、B、C、D,A 是根,它被推到 B,它被推到 C,C 被推到 D,我的按钮在 D 上,我正试图弹回B. index 方法中的对象不起作用,因为它并不总是去A->B->C->D,有时它会去A->C->B->D 所以

[self.navigationController popToViewController: [self.navigationController.viewControllers objectAtIndex:2] animated:YES];

所以这行不通。

提前感谢您的帮助。抱歉,这个问题太简单了。

【问题讨论】:

您的问题是关于推送、弹出或如何制作视图控制器? 如果视图控制器 B 在导航堆栈中,则 popToViewController 是正确的方法。您需要保留对视图控制器 B 的引用,例如作为应用程序委托的属性,或者您可以遍历导航控制器 viewcontrollerwithrestorationidentifier 数组来识别您需要的引用 - 可能使用 isMemberOf 类方法 如果你有故事板,你根本不应该打电话给pushViewController。你应该使用 push segue。 @MJN 对那个错字感到抱歉,我该如何将它作为属性保存在应用程序委托中?如何保存它的参考?谢谢 如果您打错字,请更新您的问题。 【参考方案1】:

您需要一种方法来找到要弹出的视图控制器。

-(IBAction)popToDesiredViewController:(id)sender

    UIViewController *desiredVC = nil;

    // LOOK AT ALL VIEW CONTROLLERS IN NAVIGATION CONTROLLER
    for (UIViewController *oneVC in self.navigationController.viewControllers) 

        // CHECK IF THIS IS THE VIEW CONTROLLER YOU WANT
        // change this to your logic
        BOOL foundDesiredVC = [oneVC isKindOfClass: [SignInVC class]]; 

        if (foundDesiredVC) 
            desiredVC = oneVC;
            break;
        
    

    [self.navigationController popToViewController:desiredVC animated:YES];

【讨论】:

嘿,当我在按钮按下方法中使用它时,我收到此错误“由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'试图弹出到不存在的视图控制器。' " 抱歉打错了 每次发生这种情况时所需的 VC 是否为零?如果是这样,您需要将 pop 方法包装在 if 语句中,该语句仅在 desiredVC 存在时触发。 如果我在按下按钮时注销用户然后重新登录可能会影响堆栈,我仍然会收到错误消息,我认为这是因为视图已加载? 【参考方案2】:

我个人认为这不是一个基本问题,即使我在这种情况下感到震惊。但是我通过使用“中介者设计模式”找到了一个很好的解决方案,并通过结合该方法将我的自定义 UINavigationController 开发为协调器:

- (void)setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated

并维护我自己的导航堆栈。

如果您的导航方式不可预测,协调器(您的自定义 UINavigationController)必须控制您的导航。

【讨论】:

以上是关于弹出查看控制器的主要内容,如果未能解决你的问题,请参考以下文章

在不实例化新控制器的情况下弹出查看控制器

在while循环后继续查看控制器

如何设置推送和弹出视图控制器流程

iOS 导航控制器获取弹出的视图控制器

弹出视图控制器时应用程序崩溃

是否可以将 UINavigationController 弹出两次? [复制]