导航控制器中的静态barButtonItems?

时间:2018-08-03 09:33:15

标签: ios swift uinavigationbar uibarbuttonitem

我想知道实现以下目标的最佳方法是什么。启动时,我的应用程序进入以下表格视图:

First TVC

选择类别时,将创建到另一个表视图的外观,如下所示:

Second TVC

我要做的是最终在第一个视图中具有“篮子” barButtonItem,以篮子价格的总价进行更新。我还希望按钮在整个导航控制器周期中都可见。

有没有一种方法可以使篮子按钮在导航控制器过程的每个阶段显示?

例如,我想在第二个表格视图中显示按钮。

1 个答案:

答案 0 :(得分:2)

是的,您可以使用UINavigationController的take类,如下所示

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作为窗口的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()
    }