导航控制器中的静态 barButtonItems?

Posted

技术标签:

【中文标题】导航控制器中的静态 barButtonItems?【英文标题】:Static barButtonItems in a navigation controller? 【发布时间】:2018-08-03 09:33:14 【问题描述】:

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

当您选择一个类别时,会转到另一个 tableview,如下所示:

我想要做的是最终在第一个视图中使用“篮子”barButtonItem 来更新篮子数量的总价格。我还希望按钮在整个导航控制器循环中都可见。

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

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

【问题讨论】:

您以编程方式或使用情节提要创建了导航控制器? 我使用了故事板。 好的,你是如何在第一个 ViewController 上显示篮子的? 我已将条形按钮直接拖到 TVC 顶部的 UINavigationItem 中。 【参考方案1】:

是的,您可以通过使用 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作为Window的rootView Controller。

第二种方式

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()
    

【讨论】:

感谢您的回复;我应该说,我使用了一个故事板并将我的 barbutton 直接拖到了第一个 TVC 中。 不确定,但我认为您不应该通过情节提要来实现它。只有这样才能实现,否则你应该扩展 UIViewController 并在右侧添加 BarButtonItem 并在每个视图控制器中调用此方法。 要么您必须在每个控制器中拖放条形项目,要么使用上述代码。更好的方法是使用代码实现可重用性目的 好吧,这很有道理。我对上面创建的“barButtonItem”的位置有点困惑?我是否在每个 TVC 中创建它? 我会用第二种方式更新 UIViewController 的扩展

以上是关于导航控制器中的静态 barButtonItems?的主要内容,如果未能解决你的问题,请参考以下文章

将右 barbuttonitem 添加到导航控制器 iphone sdk 后视图向上移动

如何在苹果电视的导航栏的 BarButtonItem 上移动焦点?

使用 Swift (Xcode 6) 更改 BarButtonItem 字体

BarButtonItem 上的箭头

将自定义 BarButtonItem 添加到顶部导航栏

Swift BarButtonItem 不更新