更改导航后退按钮的目的地

Kri*_*ana 8 uinavigationbar uiviewcontroller ios swift xcode6

如何更改默认导航后退按钮带我到的视图控制器?后退按钮通常会将您带回到上一个视图控制器.但是如果我想让它由两个视图控制器返回呢?我的意思是我想改变后退按钮带我到的视图控制器.我不喜欢创建自定义后退按钮.还有其他方法吗?可能是一个与后退按钮或其他东西相关的放松segue?

gly*_*uck 8

实现您想要的行为的最简单方法就是使用navigationController.setViewControllers(controllers, animated: true).

如果你想从控制器A返回2个控制器而不是只有一个,在演示A时使用这个自定义segue:

class ReplaceControllerSegue: UIStoryboardSegue {
    override func perform() {
        if let navigationController = sourceViewController.navigationController as UINavigationController? {
            var controllers = navigationController.viewControllers
            controllers.removeLast()
            controllers.append(destinationViewController)
            navigationController.setViewControllers(controllers, animated: true)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是如何在Interface Builder中为您的segue设置自定义类的好教程:http://blog.jimjh.com/a-short-tutorial-on-custom-storyboard-segues.html

如果您通过代码呈现控制器,请使用以下类别:

extension UINavigationController {
    func replaceCurrentViewControllerWith(viewController: UIViewController, animated: Bool) {
        var controllers = viewControllers
        controllers.removeLast()
        controllers.append(viewController)
        setViewControllers(controllers, animated: animated)
    }
}
Run Code Online (Sandbox Code Playgroud)

然后只需使用self.navigationController!.replaceCurrentViewControllerWith(newController, animated: true)而不是self.navigationControllerPushViewController(newController, animated: true).

可以轻松调整此代码,以根据需要删除尽可能多的控制器.


dea*_*eef 7

你可以覆盖willMoveToParentViewController.在将视图控制器添加到容器视图控制器中或从容器视图控制器中删除之前调用此方法(如a UINavigationController).添加时,parent参数包含容器视图控制器,当删除它时,parent参数为nil.

此时,您可以删除(没有动画)导航堆栈中倒数第二个视图控制器,如下所示:

Objective-C的

- (void)willMoveToParentViewController:(UIViewController *)parent
{
    [super willMoveToParentViewController:parent];

    if (parent == nil) {
        NSArray *viewControllers = self.navigationController.viewControllers;
        NSUInteger viewControllersCount = viewControllers.count;
        if (viewControllersCount > 2) {
            NSMutableArray *mutableViewControllers = [NSMutableArray arrayWithArray:viewControllers];
            [mutableViewControllers removeObjectAtIndex:(viewControllersCount - 2)];
            [self.navigationController setViewControllers:[NSArray arrayWithArray:mutableViewControllers] animated:NO];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

迅速

override func willMoveToParentViewController(parent:UIViewController?)
{
    super.willMoveToParentViewController(parent)

    if (parent == nil) {
        if let navigationController = self.navigationController {
            var viewControllers = navigationController.viewControllers
            var viewControllersCount = viewControllers.count
            if (viewControllersCount > 2) {
                viewControllers.removeAtIndex(viewControllersCount - 2)
                navigationController.setViewControllers(viewControllers, animated:false)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您也可以删除多个或添加新的.只需确保在完成后,您的数组包含至少2个视图控制器,其中最后一个不变(最后一个是被删除的,并且在调用此方法后将自动从数组中删除).

另请注意,使用nil参数可以多次调用此方法.例如,如果您尝试使用边缘滑动弹出视图控制器但在中间中止,则每次尝试时都会调用该方法.请务必添加其他检查,以确保不会删除多于您想要的视图控制器.