我有一个包含三个视图 A、B 和 C(以及更多)的故事板。从视图 B,用户可以通过点击自动创建的左侧按钮栏项目返回视图 A。通过设置 A 的导航项的后退按钮属性,我已将其上的标签更改为“取消”。
C 应该有相同的取消按钮,但是返回视图 B 没有意义;相反,它应该跳回 A。我知道如何以编程方式执行此操作,但是我应该将代码放在哪里,以便在点击 C 的取消按钮时触发它?
我有一个包含三个视图 A、B 和 C(以及更多)的故事板。从视图 B,用户可以通过点击自动创建的左侧按钮栏项目返回视图 A。通过设置 A 的导航项的后退按钮属性,我已将其上的标签更改为“取消”。
C 应该有相同的取消按钮,但是返回视图 B 没有意义;相反,它应该跳回 A。我知道如何以编程方式执行此操作,但是我应该将代码放在哪里,以便在点击 C 的取消按钮时触发它?
我发现这种方式最简单,只需输入索引:
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];
我认为您不能覆盖后退按钮功能。在这些情况下,我所做的是创建一个左栏项目,并在它的功能上决定将用户发送到哪个 navigationController 视图。
我通过使用:
[self.navigationController viewControllers] objectAtIndex:1];
索引 1 将是根 viewController 之后的第一个视图,如果 A 是您的根视图,您也可以使用:
[self.navigationController popToRootViewControllerAnimated:YES];
不要按 C,而是使用 segue 中的替换选项,以便它会自动为您执行此操作。
如果您想取消 B 或 C 的操作并返回 A,则以模态方式呈现视图控制器可能更有意义。
模态视图通常会显示一个完成任务并关闭视图的按钮,用户可以点击取消按钮来放弃任务。
当您需要提供完成与应用程序主要功能相关的独立任务的能力时,请使用模式视图。模式视图特别适用于需要始终不属于主应用程序用户界面的 UI 元素的多步骤子任务。
另一种选择:如果您将以下内容放入 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)
}
}