【问题标题】: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 对那个错字感到抱歉,我该如何将它作为属性保存在应用程序委托中?如何保存它的参考?谢谢
  • 如果您打错字,请更新您的问题。

标签: ios objective-c uinavigationcontroller pushviewcontroller poptoviewcontroller


【解决方案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)必须控制您的导航。

【讨论】:

    猜你喜欢
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 2012-12-23
    相关资源
    最近更新 更多