3

我有一个包含三个视图 A、B 和 C(以及更多)的故事板。从视图 B,用户可以通过点击自动创建的左侧按钮栏项目返回视图 A。通过设置 A 的导航项的后退按钮属性,我已将其上的标签更改为“取消”。

C 应该有相同的取消按钮,但是返回视图 B 没有意义;相反,它应该跳回 A。我知道如何以编程方式执行此操作,但是我应该将代码放在哪里,以便在点击 C 的取消按钮时触发它?

4

5 回答 5

9

我发现这种方式最简单,只需输入索引:

 [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];  
于 2013-04-16T07:48:36.263 回答
3

我认为您不能覆盖后退按钮功能。在这些情况下,我所做的是创建一个左栏项目,并在它的功能上决定将用户发送到哪个 navigationController 视图。

我通过使用:

[self.navigationController viewControllers] objectAtIndex:1];

索引 1 将是根 viewController 之后的第一个视图,如果 A 是您的根视图,您也可以使用:

[self.navigationController popToRootViewControllerAnimated:YES];
于 2012-04-17T18:13:20.827 回答
1

不要按 C,而是使用 segue 中的替换选项,以便它会自动为您执行此操作。

于 2012-04-17T16:10:10.613 回答
1

如果您想取消 B 或 C 的操作并返回 A,则以模态方式呈现视图控制器可能更有意义。

来自iOS 人机界面指南:

模态视图通常会显示一个完成任务并关闭视图的按钮,用户可以点击取消按钮来放弃任务。

当您需要提供完成与应用程序主要功能相关的独立任务的能力时,请使用模式视图。模式视图特别适用于需要始终不属于主应用程序用户界面的 UI 元素的多步骤子任务。

于 2012-04-17T19:24:28.010 回答
1

另一种选择:如果您将以下内容放入 B 中,当 C 出现时,它将从堆栈中删除它。然后堆栈看起来像[A,C]这样返回将直接进入 A。

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)

    // remove this view controller from the stack
    if let nav = self.navigationController {
        let vcs = nav.viewControllers.filter {(vc) in
            return (vc as? MyViewController) == nil
        }

        self.navigationController?.setViewControllers(vcs, animated: false)
    }
}
于 2016-06-06T14:23:02.813 回答