如何更好地弹出视图控制器?

时间:2017-10-03 11:00:48

标签: ios swift

我有一个带三个视图的导航控制器。可能的导航路线是:

VC1 - > VC3 和
VC1 - > VC2 - > VC3

当用户从VC1进入VC2并最终进入VC3时,我希望导航栏中的后退按钮指向VC1(而不是VC2)。所以在VC2中,我添加了这段代码。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    self.navigationController?.popViewController(animated: true)
}

有效;但我可以看到流行音乐发生了。当我在VC2上并且在导航到VC3的过程中,我可以看到VC1一秒钟(VC2已从堆栈中弹出),然后我看到VC3。它看起来不太好。

有更好的方法吗?

感谢。

6 个答案:

答案 0 :(得分:3)

使用popToRootViewControllerAnimated:。如果我正确理解您的问题,这正是您所需要的。

答案 1 :(得分:1)

当VC3上按下后退按钮时,您可以使用此代码。为此,您需要为VC3的后退按钮添加操作。

self.navigationController?.popToRootViewController(animated: true)

答案 2 :(得分:0)

我使用下面的代码从viewcontrollers堆栈中弹出视图。

var allViewControllers = navigationController?.viewControllers

allViewControllers?.removeLast(2) //number of views to pop

navigationController?.setViewControllers(viewControllers!, animated: true)

这不会给你视图动画问题。希望这可以帮助。 快乐的编码。

答案 3 :(得分:0)

导航到VC3后,从导航控制器的导航堆栈中删除VC2。下面是这个代码,只需在你的情况下编写你的视图控制器的索引,或者动态地使用它来工作。

self.navigationController?.viewControllers.removeAtIndex("insert here a number")

答案 4 :(得分:0)

使用 popToRootViewController ,就像其他人所说的那样

但是如果VC1不是你的rootViewController,则在弹出

时将此代码添加到VC3
for vc in (self.navigationController?.viewControllers ?? []) {
  if vc is VC1 {
    _ = self.navigationController?.popToViewController(vc, animated: true)
    break
  }
}

答案 5 :(得分:0)

您可以使用以下扩展程序直接弹出到任何viewController

extension UINavigationController {

    func popTo(controllerToPop:UIViewController)  {
        var controllersArray = self.viewControllers
        var index = 0
        var isFound = false
        for vc in controllersArray {
            if(vc.isKind(of: controllerToPop.classForCoder))
            {
                isFound = true
                break
            }
            index += 1
        }
        if(isFound)
        {
            for i in index+1 ..< controllersArray.count-1
            {
                controllersArray.remove(at: i)
            }
            self.viewControllers = controllersArray
        }
        self.popViewController(animated: true)
    }
}