将新视图控制器添加到当前堆栈



我正在将一个视图控制器插入到我当前的堆栈中。并尝试像这样执行popviewcontroller。

var viewControllersArray: [UIViewController] = self.navigationController!.viewControllers

if(dm.isLoginViewLoaded)
{
print("Login view already loaded")
}
else
{
print("Login view havent load before")
let myviewcontroller:LoginViewController=UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "LOGIN") as! LoginViewController
let index=viewControllersArray.count-2
viewControllersArray.insert(myviewcontroller, at: index)
// update navigationController viewControllers
self.navigationController!.setViewControllers(viewControllersArray, animated:false)
}
self.navigationController?.popViewController(animated: true)

但是为什么我无法实现我想要做的事情。即使在满足我的视图控制器的第二个条件下,也始终推送到根视图控制器。我想在当前视图控制器和根视图控制器之间添加新的视图控制器,并执行弹出操作。请帮助我。 谢谢

试试这段代码:

let arrController:[UIViewController] = (self.navigationController?.viewControllers)!//array of all controllers in navigation stack
for vc in arrController
{
if (type(of: vc)  == type(of: LoginViewController
))//check exist or not
{
self.navigationController?.popToViewController((arrController[(arrController.index(of: vc))!]), animated: true)
}
} 

我认为您只是"错误地计算"了数组位置。您的索引应为:

let index = viewControllersArray.count - 1   // *not* -2

但是,这可能是一种更"健壮"的方法:

@IBAction func popToLogin(_ sender: Any) {
if let navVC = self.navigationController {
var bFoundLogin = false
var viewControllersArray = navVC.viewControllers
for vc in viewControllersArray.reversed() {
if vc is LoginViewController {
// we found LoginViewController in stack, so
//  pop to it (even if it's multiple levels back)
bFoundLogin = true
navVC.popToViewController(vc, animated: true)
// found it, so break out of the for loop
break
}
}
if !bFoundLogin {
// we didn't find LoginViewController in stack, so
//  replace current VC with LoginVC
//if let loginVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "LOGIN") as? LoginViewController {
if let loginVC = UIStoryboard(name: "AnimConstraints", bundle: nil).instantiateViewController(withIdentifier: "LOGIN") as? LoginViewController {
// insert loginVC before last item
viewControllersArray.insert(loginVC, at: viewControllersArray.count - 1)
// set the NavVC's array of controllers
navVC.setViewControllers(viewControllersArray, animated: false)
// pop back one level (to our inserted loginVC)
navVC.popViewController(animated: true)
}
}
}
}

使用循环在堆栈中"查找"LoginViewController,即使它不是"下一个排队",也可以"弹出",并且还消除了对dm.isLoginViewLoaded跟踪的需要(除非您在其他地方使用它(。

最新更新