从导航堆栈中删除视图控制器时如何删除导航栏项目?

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"
    }
}