Swift 4 UINavigationController导航栏添加按钮UIBarButtonItem无效

àì夳堔傛蜴生んèń 2023-06-30 05:29 99阅读 0赞

设置UINavigationControllerrootViewController属性后,root页面的上方会自动补充一个导航栏(实际上是Navigation Item),如下:
在这里插入图片描述
如果是使用StoryBoard,我们可以直接拖拽UIBarButtonItem加入按钮。

如果我们使用的是代码控制页面跳转,怎么在跳转后的页面上添加UIBarButtonItem呢?可以如下面这样写:

  1. /// MyViewController.swift
  2. override func viewDidLoad() {
  3. let backBtn = UIBarButtonItem(image: UIImage(named: "back"),
  4. style: .plain,
  5. target: self,
  6. action: #selector(back))
  7. // 注意不要多此一举写成,self.navigationController?.navigationItem.leftBarButtonItem = btn1
  8. self.navigationItem.leftBarButtonItem = btn1
  9. }

如果有多个UIBarButtonItem

  1. self.navigationItem.leftBarButtonItems = [btn1, btn2, btn3]

实际上,swift提供了8种设置item的方式:

  1. @available(iOS 5.0, *)
  2. open var leftBarButtonItems: [UIBarButtonItem]?
  3. @available(iOS 5.0, *)
  4. open var rightBarButtonItems: [UIBarButtonItem]?
  5. @available(iOS 5.0, *)
  6. open func setLeftBarButtonItems(_ items: [UIBarButtonItem]?, animated: Bool)
  7. @available(iOS 5.0, *)
  8. open func setRightBarButtonItems(_ items: [UIBarButtonItem]?, animated: Bool)
  9. open var leftBarButtonItem: UIBarButtonItem?
  10. open var rightBarButtonItem: UIBarButtonItem?
  11. open func setLeftBarButton(_ item: UIBarButtonItem?, animated: Bool)
  12. open func setRightBarButton(_ item: UIBarButtonItem?, animated: Bool)

踩坑

直接设置UINavigationControllernavigationItem是无效的,比如下面这样写是不行的:

  1. // 自定义的root页面控制器
  2. let root = MyUIViewController()
  3. // 导航控制器
  4. let navController = UINavigationController(rootViewController: root)
  5. // 设置无效,必须在root控制器里设置
  6. navController.navigationItem.leftBarButtonItem = backBtn
  7. parentViewController?.present(navController,
  8. animated: true,
  9. completion: nil)

为什么可以直接在root指向的Controller内部设置navigationItem的按钮呢?

实际上我们在root看到的navigationItem是所有UIViewController都具有的属性,是Swift为了支持导航栏而增加的属性,我们跳到self.navigationItem的源文件看一下就了解了:

  1. extension UIViewController {
  2. // Created on-demand so that a view controller may customize its navigation appearance.
  3. open var navigationItem: UINavigationItem { get }
  4. // If YES, then when this view controller is pushed into a controller hierarchy with
  5. // a bottom bar (like a tab bar), the bottom bar will slide out. Default is NO.
  6. open var hidesBottomBarWhenPushed: Bool
  7. // If this view controller has been pushed onto a navigation controller, return it.
  8. open var navigationController: UINavigationController? { get }
  9. }

原来所有的UIViewController都有导航栏,只是需要配合UINavigationController使用。

我们直接使用self.navigationItem即可设置页面的导航栏,同时也要注意不要多此一举设置self.navigationController.navigationItem,这是无效的。


正文结束,欢迎留言讨论。如果文章帮助到你,也欢迎为本文点赞哦。

发表评论

表情:
评论列表 (有 0 条评论,99人围观)

还没有评论,来说两句吧...

相关阅读