从导航堆栈中删除视图控制器时如何删除导航栏项目?
How to remove navigation bar items when a view controller is removed from navigation stack?
我将在用户登录后从导航堆栈中删除登录视图控制器。但是,登录视图控制器添加的导航栏按钮项目仍然存在。如何从导航堆栈中完全删除视图控制器?
static func removePreviousFromNavigationStack(_ navVC: UINavigationController) {
var navArr = navVC.viewControllers
for elem in navArr {
if elem.isKind(of: LoginViewController.self) {
if let vc = StateData.loginVC {
vc.navigationItem.leftBarButtonItem = nil // is not working as intended
vc.navigationItem.rightBarButtonItem = nil
vc.navigationItem.title = "Foo"
}
//elem.removeFromParent()
}
}
navArr.remove(at: navArr.count - 2)
navVC.viewControllers = navArr
}
Flow: HomeVC -> ApplyVC -> LoginVC -> FormVC
登录到FormVC
后,我调用remove方法从堆栈中删除LoginVC
。这会删除 VC,但导航按钮仍然存在。如果我将导航按钮设置为 nil,则 ApplyVC
的左按钮项、后退按钮、右键项目、主页按钮不会显示。有一个透明的后退按钮,单击后会显示 ApplyVC
的导航栏按钮,就好像 LoginVC
从视图中弹出一样,但当前视图没有任何变化。
尝试在推送 FormVC
时移除 LoginVC
,而不是在 FormVC
可见后移除。
我创建了与您相同的 NavigationStack
。
1.在HomeVC
中添加了一个rightBarButton
class HomeVC: UIViewController {
var rightBarItem: UIBarButtonItem = {
return UIBarButtonItem(barButtonSystemItem: .bookmarks, target: nil, action: nil)
}()
override func viewDidLoad() {
super.viewDidLoad()
self.title = "HomeVC"
self.navigationItem.rightBarButtonItem = rightBarItem
}
}
class ApplyVC: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.title = "ApplyVC"
}
}
2.在LoginVC
中添加了一个rightBarItem
class LoginVC: UIViewController {
var rightBarItem: UIBarButtonItem = {
return UIBarButtonItem(barButtonSystemItem: .add, target: nil, action: nil)
}()
override func viewDidLoad() {
super.viewDidLoad()
self.title = "LoginVC"
self.navigationItem.rightBarButtonItem = rightBarItem
}
@IBAction func onTapButton(_ sender: UIButton) {
var controllers = self.navigationController?.viewControllers
let formVC = self.storyboard?.instantiateViewController(withIdentifier: "FormVC") as! FormVC
controllers?.removeAll(where: { [=11=] is LoginVC })
controllers?.append(formVC)
if let controllers = controllers {
self.navigationController?.setViewControllers(controllers, animated: true)
}
}
}
在上面的代码中,我过滤了 LoginVC
并从 navigationController’s
viewControllers array
添加了 FormVC
。
class FormVC: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.title = "FormVC"
}
}
我将在用户登录后从导航堆栈中删除登录视图控制器。但是,登录视图控制器添加的导航栏按钮项目仍然存在。如何从导航堆栈中完全删除视图控制器?
static func removePreviousFromNavigationStack(_ navVC: UINavigationController) {
var navArr = navVC.viewControllers
for elem in navArr {
if elem.isKind(of: LoginViewController.self) {
if let vc = StateData.loginVC {
vc.navigationItem.leftBarButtonItem = nil // is not working as intended
vc.navigationItem.rightBarButtonItem = nil
vc.navigationItem.title = "Foo"
}
//elem.removeFromParent()
}
}
navArr.remove(at: navArr.count - 2)
navVC.viewControllers = navArr
}
Flow: HomeVC -> ApplyVC -> LoginVC -> FormVC
登录到FormVC
后,我调用remove方法从堆栈中删除LoginVC
。这会删除 VC,但导航按钮仍然存在。如果我将导航按钮设置为 nil,则 ApplyVC
的左按钮项、后退按钮、右键项目、主页按钮不会显示。有一个透明的后退按钮,单击后会显示 ApplyVC
的导航栏按钮,就好像 LoginVC
从视图中弹出一样,但当前视图没有任何变化。
尝试在推送 FormVC
时移除 LoginVC
,而不是在 FormVC
可见后移除。
我创建了与您相同的 NavigationStack
。
1.在HomeVC
rightBarButton
class HomeVC: UIViewController {
var rightBarItem: UIBarButtonItem = {
return UIBarButtonItem(barButtonSystemItem: .bookmarks, target: nil, action: nil)
}()
override func viewDidLoad() {
super.viewDidLoad()
self.title = "HomeVC"
self.navigationItem.rightBarButtonItem = rightBarItem
}
}
class ApplyVC: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.title = "ApplyVC"
}
}
2.在LoginVC
rightBarItem
class LoginVC: UIViewController {
var rightBarItem: UIBarButtonItem = {
return UIBarButtonItem(barButtonSystemItem: .add, target: nil, action: nil)
}()
override func viewDidLoad() {
super.viewDidLoad()
self.title = "LoginVC"
self.navigationItem.rightBarButtonItem = rightBarItem
}
@IBAction func onTapButton(_ sender: UIButton) {
var controllers = self.navigationController?.viewControllers
let formVC = self.storyboard?.instantiateViewController(withIdentifier: "FormVC") as! FormVC
controllers?.removeAll(where: { [=11=] is LoginVC })
controllers?.append(formVC)
if let controllers = controllers {
self.navigationController?.setViewControllers(controllers, animated: true)
}
}
}
在上面的代码中,我过滤了 LoginVC
并从 navigationController’s
viewControllers array
添加了 FormVC
。
class FormVC: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.title = "FormVC"
}
}