Ios 我在从导航堆栈中删除ViewController时遇到问题?
我有5个VC,我正在成功地从导航堆栈中删除ViewController。但问题是,当单击导航上的“后退”按钮时,它将移动到以前的VC,并在导航栏上显示已删除的VC 我有5个风险投资:VC1、VC2、VC3、VC4、VC5 现在我从VC1->VC2导航。。。。。VC4->VC5。我有自定义的导航栏返回按钮标题。这里我将从堆栈中删除VC4 当点击VC5中的后退按钮时,它将直接进入VC3。但导航栏是VC4。当再次单击导航栏时,它将在同一个VC中显示VC3导航栏 如何解决这个问题。我想直接显示VC3和VC3导航栏在一次点击 从导航堆栈中删除VC的代码:Ios 我在从导航堆栈中删除ViewController时遇到问题?,ios,swift,xcode,cocoa-touch,uinavigationcontroller,Ios,Swift,Xcode,Cocoa Touch,Uinavigationcontroller,我有5个VC,我正在成功地从导航堆栈中删除ViewController。但问题是,当单击导航上的“后退”按钮时,它将移动到以前的VC,并在导航栏上显示已删除的VC 我有5个风险投资:VC1、VC2、VC3、VC4、VC5 现在我从VC1->VC2导航。。。。。VC4->VC5。我有自定义的导航栏返回按钮标题。这里我将从堆栈中删除VC4 当点击VC5中的后退按钮时,它将直接进入VC3。但导航栏是VC4。当再次单击导航栏时,它将在同一个VC中显示VC3导航栏 如何解决这个问题。我想直接显示VC3和V
guard let navigationController = self.navigationController else { return }
var navigationArray = navigationController.viewControllers // To get all UIViewController stack as Array
navigationArray.remove(at: navigationArray.count - 2) // To remove previous UIViewController
self.navigationController?.viewControllers = navigationArray
使用以下命令:
navigationController?.setViewControllers(navigationArray!, animated: true)
例如
从:
使用此方法更新或替换当前视图控制器堆栈
无需明确按下或弹出每个控制器。此外
此方法允许您在不设置动画的情况下更新控制器集
这些更改可能在您需要的启动时适用
将导航控制器返回到以前的状态
如果启用了动画,此方法将决定动画的类型
根据项目中的最后一个项目是否
阵列已在导航堆栈中。如果视图控制器是
当前在堆栈中,但不是最上面的项,此方法使用
流行音乐的转变;如果它是最上面的项,则不允许转换
表演。如果视图控制器不在堆栈上,则此方法
使用推送转换。仅执行一次转换,但在
转换完成后,堆栈的所有内容都将被删除
替换为新的视图控制器。例如,如果控制器A,
B、 和C在堆栈上,设置控制器D、A和B,如下所示
方法使用pop转换,结果堆栈包含
控制器D、A和B
编辑1
按下VC5时,请使用以下代码
let vc = YourVC5()
var array = navigationController?.viewControllers
array?.removeLast()
array?.append(vc)
navigationController?.setViewControllers(array!, animated: true)
我们的想法是,当您将VC5推入堆栈时,在按下之前,我们将从列表中排除VC4,因此默认情况下,VC5下面将有VC3,您只需调用navigationController?。popViewControlleranimated:true,它应直接弹出到VC3隐藏默认后退按钮,并添加带有操作的自定义后退按钮:
override func viewDidLoad {
super.viewDidLoad()
self.navigationItem.hidesBackButton = true
let customBackButton = UIBarButtonItem(title: "Back", style: UIBarButtonItem.Style.plain, target: self, action: #selector(back))
self.navigationItem.leftBarButtonItem = customBackButton
}
使用popToViewController移回特定的viewcontroller:
@objc func back(sender: UIBarButtonItem) {
guard let navigationController = self.navigationController else { return }
var navigationArray = navigationController.viewControllers // To get all
self.navigationController!.popToViewController(navigationArray[navigationArray.count - 2], animated: true)
}
您可以使用上面回答的Prakash Shaiva:
guard let navigationController = self.navigationController else { return }
var navigationArray = navigationController.viewControllers // To get all
self.navigationController.popToViewController(navigationArray[navigationArray.count - 2], animated: true)
并尝试在VC3的方法中更新导航栏。如果使用自定义导航栏,则需要在VC5中使用自定义后退按钮单击操作:-
如果您可以使用默认导航栏,则需要在VC5的导航堆栈中删除VC4,如下所示:-
guard let navigationController = self.navigationController else { return }
var navigationArray = navigationController.viewControllers // To get all UIViewController stack as Array
navigationArray.remove(at: navigationArray.count - 2) // To remove previous UIViewController
self.navigationController?.viewControllers = navigationArray
这两条线的区别。。。self.navigationController?.viewControllers=navigationaray无需。。guard let navigationController=self.navigationController else{return}var navigationaray=navigationController.viewControllers navigationaray.removeat:navigationaray.count-2 self.navigationController?.viewControllers=navigationaray self.navigationController?.setviewcontrollers navigationaray,动画:true这是我的代码,ui已更新但不工作。获得相同的结果。您需要删除此行self.navigationController?.ViewController=navigationArray@iOS我已经用一个例子更新了我的答案,当你想移动到VC3时,请勾选在VC5中写入这个当单击导航栏上的后退按钮时,我想直接移动到VC3。这是默认行为。。如何编写。将自定义后退按钮添加到导航栏,并在自定义后退操作中编写此代码button@iOS用自定义后退按钮更新了我的答案。。。让我们检查一下,我也在做同样的事情。请参阅参考。我不创建自定义后退按钮。内置的后退按钮工作。
@IBAction func btnBackAction(_ sender: UIButton) {
let vc = VC3()
self.navigationController.popToViewController(vc, animated: true)
}
guard let navigationController = self.navigationController else { return }
var navigationArray = navigationController.viewControllers // To get all UIViewController stack as Array
navigationArray.remove(at: navigationArray.count - 2) // To remove previous UIViewController
self.navigationController?.viewControllers = navigationArray