在导航堆栈中跳过/添加视图控制器

Ale*_*erg 17 uinavigationcontroller ios swift

我在导航控制器中嵌入了三个视图控制器.我想从VC1转到VC3,这样在VC3中导航项的后退按钮会将用户引导到VC2而不是VC1.我认为这应该通过创建VC3将VC2添加到VC1和VC3之间的导航堆栈跳过第二个View Controller来完成.

我试过这个:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if let identifier = segue.identifier {
        switch identifier {
        case "JumpToThirdVCSegue":
            if let secondvc = segue.destinationViewController as? SecondViewController {
                secondvc.performSegueWithIdentifier("ThirdVCSegue", sender: self)
            }
        default: break
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但我无法让它发挥作用.当View Controller尚未打开时,可能无法执行segue?

在导航堆栈中跳过View Controller /添加View Controller的最佳方法是什么?我希望这可以帮助你理解我正在做的事情:

Ada*_*dam 23

这样的事情应该有效:

    self.navigationController?.pushViewController(viewController2, animated: true)
    self.navigationController?.pushViewController(viewController3, animated: true)
Run Code Online (Sandbox Code Playgroud)

编辑:

如果要在不被用户注意的情况下推送第二个视图控制器,则需要在按下第三个视图控制器后将其添加到导航控制器.这可以通过实施来完成UINavigationControllerDelegate.您可以将第二个视图控制器存储在变量中,并将其插入到委托方法中的导航控制器层次结构中.您的主视图控制器将如下所示:

class MyViewController: UIViewController, UINavigationControllerDelegate {

    var viewControllerToInsertBelow : UIViewController?

    override func viewDidLoad() {
        super.viewDidLoad()
        self.navigationController?.delegate = self
    }

    func pushTwoViewControllers() {
        if let viewController2 = self.storyboard?.instantiateViewControllerWithIdentifier("id1"),
            let viewController3 = self.storyboard?.instantiateViewControllerWithIdentifier("id2") { //change this to your identifiers
                self.viewControllerToInsertBelow = viewController2
                self.navigationController?.pushViewController(viewController3, animated: true)
        }
    }

    //MARK: - UINavigationControllerDelegate
    func navigationController(navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) {
        if let vc = viewControllerToInsertBelow {
            viewControllerToInsertBelow = nil
            let index = navigationController.viewControllers.indexOf(viewController)!
            navigationController.viewControllers.insert(vc, atIndex: index)
        }
    }

}
Run Code Online (Sandbox Code Playgroud)


小智 8

if var navstack = navigationController?.viewControllers{
                    navstack.append(contentsOf: [vc1,vc2])
                    navigationController?.setViewControllers(navstack, animated: true)
                }
Run Code Online (Sandbox Code Playgroud)

效果很好


Mar*_*Him 6

编辑:使用swift和segues,这应该工作:

override func performSegueWithIdentifier(identifier: String?, sender: AnyObject?) {
    super.performSegueWithIdentifier(identifier, sender: sender);

    if identifier == "JumpToThirdVCSegue" {
        // now the vc3 was already pushed on the navigationStack
        var navStackArray : [AnyObject]! = self.navigationController!.viewControllers
        // insert vc2 at second last position
        navStackArray.insert(viewController2, atIndex: navStackArray.count - 2)
        // update navigationController viewControllers
        self.navigationController!.setViewControllers(navStackArray, animated:false)
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,您可以覆盖VC1中的performSegueWithIdentifier,以便在实际执行segue到VC3时更改导航堆栈(并且不仅仅是在准备中).这假设您要在VC1中处理此特殊导航逻辑.