Swift 4 UINavigationController导航栏添加按钮UIBarButtonItem无效
设置UINavigationController
的rootViewController
属性后,root页面的上方会自动补充一个导航栏(实际上是Navigation Item),如下:
如果是使用StoryBoard,我们可以直接拖拽UIBarButtonItem
加入按钮。
如果我们使用的是代码控制页面跳转,怎么在跳转后的页面上添加UIBarButtonItem
呢?可以如下面这样写:
/// MyViewController.swift
override func viewDidLoad() {
let backBtn = UIBarButtonItem(image: UIImage(named: "back"),
style: .plain,
target: self,
action: #selector(back))
// 注意不要多此一举写成,self.navigationController?.navigationItem.leftBarButtonItem = btn1
self.navigationItem.leftBarButtonItem = btn1
}
如果有多个UIBarButtonItem
:
self.navigationItem.leftBarButtonItems = [btn1, btn2, btn3]
实际上,swift提供了8种设置item的方式:
@available(iOS 5.0, *)
open var leftBarButtonItems: [UIBarButtonItem]?
@available(iOS 5.0, *)
open var rightBarButtonItems: [UIBarButtonItem]?
@available(iOS 5.0, *)
open func setLeftBarButtonItems(_ items: [UIBarButtonItem]?, animated: Bool)
@available(iOS 5.0, *)
open func setRightBarButtonItems(_ items: [UIBarButtonItem]?, animated: Bool)
open var leftBarButtonItem: UIBarButtonItem?
open var rightBarButtonItem: UIBarButtonItem?
open func setLeftBarButton(_ item: UIBarButtonItem?, animated: Bool)
open func setRightBarButton(_ item: UIBarButtonItem?, animated: Bool)
踩坑
直接设置UINavigationController
的navigationItem
是无效的,比如下面这样写是不行的:
// 自定义的root页面控制器
let root = MyUIViewController()
// 导航控制器
let navController = UINavigationController(rootViewController: root)
// 设置无效,必须在root控制器里设置
navController.navigationItem.leftBarButtonItem = backBtn
parentViewController?.present(navController,
animated: true,
completion: nil)
为什么可以直接在root
指向的Controller
内部设置navigationItem
的按钮呢?
实际上我们在root
看到的navigationItem
是所有UIViewController
都具有的属性,是Swift为了支持导航栏而增加的属性,我们跳到self.navigationItem
的源文件看一下就了解了:
extension UIViewController {
// Created on-demand so that a view controller may customize its navigation appearance.
open var navigationItem: UINavigationItem { get }
// If YES, then when this view controller is pushed into a controller hierarchy with
// a bottom bar (like a tab bar), the bottom bar will slide out. Default is NO.
open var hidesBottomBarWhenPushed: Bool
// If this view controller has been pushed onto a navigation controller, return it.
open var navigationController: UINavigationController? { get }
}
原来所有的UIViewController
都有导航栏,只是需要配合UINavigationController
使用。
我们直接使用self.navigationItem
即可设置页面的导航栏,同时也要注意不要多此一举设置self.navigationController.navigationItem
,这是无效的。
正文结束,欢迎留言讨论。如果文章帮助到你,也欢迎为本文点赞哦。
还没有评论,来说两句吧...