指定每个视图控制器的“后退”按钮的行为

时间:2016-08-15 11:40:04

标签: ios swift uinavigationcontroller segue

我有几个视图控制器,称它们为1,2,3,4,5和6.我创建了一个UINavigationController并且它有一个后退按钮。后退按钮出现在每个视图控制器上(我从不隐藏它)。

现在我有这样的情况。我从1,2,3,4,5然后回到3.作为附加信息,从5到3的转换是使用手动segue完成的(但有时我使用其他segue,如push或modal)。如果我点击该视图控制器上的后退按钮,通常会转到5,因为堆叠工作原理。但是我希望能够从视图控制器3中指定,当点击“后退”按钮时,你总是转到vc 2 ...

我想在这里操纵导航堆栈可能是一种方法(基于当前的视图控制器),但我不知道那是理想的,还是有更合适的东西......

4 个答案:

答案 0 :(得分:2)

您可以继承并覆盖UINavigationController中的某些方法,以便在按下后退按钮时获得回调。然后,您可以强制导航控制器响应您的需要。

例如,当调用popViewController(animated:)时,您可以根据视图控制器(或者您想要的话)确定是否应该实际允许正常的后退按钮功能。如果您想要正常行为,只需致电super即可。如果从视图控制器3转到视图控制器2(而不是视图控制器5),则不会调用super,而是执行popToViewController(viewController2, animated: animated)

答案 1 :(得分:2)

通常,当我想“跳转”回多个视图时,我使用了“委托”。你真正想要做的就是从堆栈中弹出几个不仅仅是想要去的地方。

我建议的是每个VC传递的委托方法。即VC 1可以解除VC 2,VC 2可以解除VC 3等等。然后当你在VC 5上调用navigateToView(index:Int)时你会快速检查一下,如果他们查看响应该委托调用的控制器匹配那个索引那么你只需弹出以前显示的VC就可以了。如果不是,则弹出先前显示的VC,然后调用该VC委托方法,直到达到您想要的位置。

常见的设计模式是负责显示另一个VC的VC,它决定是否应该将其解散。如果需要,这还可让您灵活地更新UI,然后再返回上一个视图。

希望这有一定道理并且很有帮助。

答案 2 :(得分:1)

使用您自己的自定义按钮替换后退按钮,您可以将操作设置为执行segue回到3.或者您可以使用导航控制器子堆栈返回到3,这是您喜欢的。

在视图控制器中添加以下代码:

let backButton: UIBarButtonItem = UIBarButtonItem(title: "Back", style: .plain, target: self, action: #selector(viewController.navigationController?.popViewController(animated:)))

    viewController.navigationItem.setLeftBarButton(backButton, animated: true)

目前,该操作将使用默认行为并弹回一个。但是,您可以使用自己的方法更改此设置并将segue执行回3。

答案 3 :(得分:0)

让我们考虑你已经打开了VC的1,2,3,4,5。 比你打开VC 3。 所以你有UINavigationController controllers堆栈[1,2,3,4,5,3]

如果您想要转换回UIViewController#3,您可以在过渡结束#3时删除控制器#3,#4和#5(从导航堆栈的中间)。< / p>

func viewDidLoad() {
       self.navigationController.delegate = self
}

func navigationController(navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) {

    NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray: navigationController.viewControllers];
//Navigation stack now is [1, 2, 3, 4, 5, 3]. removing VC #3
        [allViewControllers removeObjectAtIndex: 2];

//Navigation stack now is [1, 2, 4, 5, 3]. removing VC #4
        [allViewControllers removeObjectAtIndex: 2];

//Navigation stack now is [1, 2, 5, 3].removing VC #5
        [allViewControllers removeObjectAtIndex: 2];

//Navigation stack now is [1, 2, 3]
navigationController.viewControllers = allViewControllers;

}

从导航堆栈中删除了视图控制器后,您将从3转换回2