我有一个带三个视图的导航控制器。可能的导航路线是:
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。它看起来不太好。
有更好的方法吗?
感谢。
答案 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,则在弹出
时将此代码添加到VC3for 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)
}
}