【问题标题】:Swift 3 - Add navigation items to UINavigationController subclassSwift 3 - 将导航项添加到 UINavigationController 子类
【发布时间】:2017-09-09 01:23:42
【问题描述】:

我有一个UINavigationController 的子类,称为NavController。我将其子类化的原因是因为我正在以编程方式构建 UI,对于这个特定的导航类,我需要在其导航栏的左/右部分有一个特定的按钮。

这是我在子类中的:

import UIKit
class NavController: UINavigationController {

override func viewDidLoad() {
    super.viewDidLoad()

    self.view.backgroundColor = UIColor.white
    self.navigationBar.alpha = 1.0
    self.navigationBar.barTintColor = UIColor.navi
    self.navigationBar.isTranslucent = false
    self.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]

    // tearing my hair out here
    let refresh = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.refresh, target: self, action: #selector(doSomething))


    self.navigationItem.leftBarButtonItem = refresh

}

func doSomething() {

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}
}

self 访问navigationItem.leftBarButtonItem 是否正确? 我的头发快用完了。

提前致谢。

【问题讨论】:

  • 你可以使用。

标签: ios swift swift3


【解决方案1】:

快速回答:没有。

navigationItem.leftBarButtonItem 是 UINavigationController 中视图控制器的属性,而不是导航控制器本身。

例如:

let firstVC = UIViewController()
let firstBarItem = UIBarButtonItem()
firstVC.navigationItem.rightBarButtonItem = firstBarItem
let nc = UINavigationController(rootViewController: firstVC)

导航控制器现在显示firstBarItem

let secondVC = UIViewController()
let secondBarItem = UIBarButtonItem()
secondVC.navigationItem.rightBarButtonItem = secondBarItem

nc.pushViewController(secondVC, animated: true)

导航控制器现在显示secondBarItem

如果弹回firstVC,会自动显示firstBarItem

【讨论】:

  • 我明白了。那么如何从导航控制器本身访问它呢?
  • 可以从导航控制器的子视图控制器中获取最后一个视图控制器(当前显示的视图控制器):nc.viewControllers.last?.navigationItem.rightBarButtonItem
  • 那么我应该重复相同的代码在每个子viewController中添加按钮吗?
  • 如果只需要1行就可以了。否则有很多方法可以重用您的代码,例如:子类 UIViewController、创建类别、...
【解决方案2】:

您想在导航栏中显示refresh 按钮吗?但是当前的代码不能做到这一点,对吧?让我们使用这段代码:

if let navigationItem = navigationBar.items?.first {
    navigationItem.leftBarButtonItem = refresh
}

【讨论】:

    【解决方案3】:
    // Below Code is for Left Side UIBarButtonItem for Navigation Bar
    let leftItemBarButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(leftBarButtonTapped))
    
    self.navigationItem.leftBarButtonItem = leftItemBarButton
    
    func leftBarButtonTapped() {
    print("Left Bar Button Item")
    }
    
    // Below Code is for Right Side UIBarButtonItem for Navigation Bar
    
    let rightItemBarButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(rightBarButtonTapped))
    
    self.navigationItem.rightBarButtonItem = rightItemBarButton
    
    func rightBarButtonTapped() {
    print("Right Bar Button Item")
    }
    

    如果您想使用 UIBarButtonItem 方法将图像放入导航栏中,也有不同的方法

    【讨论】:

    • 这与我的问题中的代码有什么区别?
    【解决方案4】:

    试试这个方法

    class BaseNavigationController: UINavigationController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
    
            // Do your customization here
            if let rootVC = self.viewControllers.first {
                self.addCancelButton(rootVC: rootVC)
            }
        }
    
        func addCancelButton(rootVC: UIViewController) {
            let barButton = UIBarButtonItem(image: UIImage(named: "cancel"), style: .plain, target: self, action: #selector(btnClose))
            barButton.tintColor = .black
            rootVC.navigationItem.leftBarButtonItem = barButton
        }
    
        @objc func btnClose() {
            self.dismiss(animated: true, completion: nil)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-18
      • 2015-09-04
      • 2015-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-14
      • 1970-01-01
      相关资源
      最近更新 更多