使用UINavigationController和Storyboard返回两个级别

时间:2012-04-17 15:47:45

标签: iphone ios uinavigationcontroller

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

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

5 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:2)

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

我通过使用:

来做到这一点
[self.navigationController viewControllers] objectAtIndex:1];

索引1将是根视图控制器之后的第一个视图,如果A是你的rootView,你也可以使用:

[self.navigationController popToRootViewControllerAnimated:YES];

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

来自iOS human interface guidelines:

  

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

     

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

答案 4 :(得分: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)
    }
}