使用UINavigationController和Storyboard返回两个级别

3
我有一个包含三个视图A、B和C(以及更多)的Storyboard。在视图B中,用户可以通过点击自动创建的左侧按钮栏项返回到视图A。我已经通过设置A的导航项的“返回按钮”属性将其标签更改为“取消”。
C应该有相同的“取消”按钮,但是回到B视图并没有意义;相反,它应该跳回A视图。我知道如何在程序中实现这一点,但是我应该把代码放在哪里才能在C的“取消”按钮被点击时触发它?
5个回答

9
我发现这种方法最简单,只需在索引处添加:
 [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];  

3

我认为你无法覆盖返回按钮的功能。在这种情况下,我会创建一个左侧条目,并在其函数中决定将用户发送到哪个导航控制器视图。

我通过使用以下代码来实现:

[self.navigationController viewControllers] objectAtIndex:1];

如果A是你的根视图控制器,那么索引1将成为根视图控制器后的第一个视图。您也可以使用以下代码:

[self.navigationController popToRootViewControllerAnimated:YES];

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)
    }
}

1

不要使用 C 按钮,而是在 segue 中使用替换选项,这样它就会自动为您完成。


听起来很有前途,但我没有看到替换选项。快速谷歌搜索表明这可能只是iPad上的功能? - Nestor
有趣...我认为它应该适用于两者,但我以前没有在iPhone上做过。 - lnafziger

1

如果您想要取消从B或C的操作并返回到A,使用模态视图控制器可能更有意义。

来自iOS人机界面指南:

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

当您需要提供与应用程序主要功能相关的自包含任务的能力时,请使用模态视图。特别适合于需要UI元素的多步骤子任务,这些元素不一定始终属于主应用程序用户界面。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接