导航控制器中的静态 barButtonItems?

Static barButtonItems in a navigation controller?

我想知道实现以下目标的最佳方法是什么。我的应用程序在启动时转到以下 table 视图:

当您 select 一个类别时,会生成另一个 table 视图的转场,看起来像这样:

我想要做的是,最终让第一个视图中的 'Basket' barButtonItem 更新为篮子数量的总价。我还希望按钮在整个导航控制器周期中可见。

有没有办法让我在导航控制器进程的每个阶段都显示购物篮按钮?

例如,我希望在第二个 table 视图中显示按钮。

是的,您可以通过使用 UINavigationController 的 class 来实现它,如下所示

class CustomNavigationController: UINavigationController, UINavigationControllerDelegate{

    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = self
    }

    // MARK: Private Functions
    private func addRightBarButtonTo(viewController: UIViewController){    
        barButtonItem = UIBarButtonItem(title: "Basket", style: .plain, target: self, action: #selector(CustomNavigationController.dismiss(_:)))
        viewController.navigationItem.rightBarButtonItem = barButtonItem
    }

    // MARK: UINavigationController Delegate
    func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
        self.addRightBarButtonTo(viewController)
    }

    @objc func dismiss(sender: Any){
        self.presentingViewController?.dismissViewControllerAnimated(true, completion: nil)
    }
}

使用 CustomNavigationController 作为 Window 的 rootView 控制器。

第二种方式

扩展 UIViewController

extension UIViewController {
    func addRightButtonItem() {
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Basket", style: .done, target: self, action: #selector(barButtonMethod(_:)))
    }
    
    @objc func barButtonMethod(_ sender: UIBarButtonItem) {
        // Your code
    }
}

并在每个 viewController

的 viewWillAppear 中调用以下方法
override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
      
        self.addRightButtonItem()
    }