由backBarButtonItem引起的navigationItem的一点研究

    今天下午一个开发者群里有人提出了这样一个问题:“我有时候修改navigationController的backBarButtonItem的title不能修改,一直是back怎么解决?”,他的代码如下:

var back = UIBarButtonItem()
back.title=“test”            
var soundTypeSVC = BJWSoundTypeSelectViewController()
self.navigationController?.navigationItem.backBarButtonItem=back
self.navigationController?.pushViewController(soundTypeSVC, animated: true)
    虽然我根据经验很快告诉他应该这么写:self.navigationItem.backBarButtonItem=back(因为之前我也纠结过同样的问题),正好手头没活,写了个测试程序研究一下这个问题。

   测试程序很简单,不上代码了,简要描述一下就是vc1是一个导航控制器UINavigationController的根控制器,vc1上存在一个button,点击可跳转至vc2(vc1,vc2均为自定义控制器). 分别在vc1到vc2的跳转方法和vc2的viewDidLoad方法打上断点,分别查看self.navigationItem和self.navigationController.navigationItem及其包含的属性值。结果见下图:


     显而易见的可以看到,因为test1和test2在同一个UINavigationController栈中,所以他们的navigationController.navigationItem是相同的,而test1和test2的self.navigationItem是不一样的。追根溯源可以在UIViewController中定位到navigationItem属性,test1和test2分属于不同的控制器对象,其navigationItem当然不会一样了。

    那么问题来了,究竟他们直接有什么关系呢?

    首先,可以得出的结论是每个viewController(无论是否在一个uinavcontroller栈中)都有一个navigationItem属性(本质为一个数据模型),决定其navBar上的显示(Model提供数据,View展示数据,符合apple一直强调的MVC思想)。UINavigationController继承自UIViewController,所以其自然也拥有了navigationItem属性,但如果直接使用self.navigationController.navigationItem进行设置,并不能影响导航栏的显示。举个栗子,也就是说,使用self.navigationController.navigationItem.title = @"vc1"设置导航栏标题是无效的,只有使用self.navigationItem.title才能进行设置。通常我们直接使用self.title来设置导航栏标题,其实这句等价与同时设置了self.navigationItem.title和self.navigationController.navigationItem.title,但真正起作用的还是前者。

    同样的,要想使用backBarButtonItem,由于其只是一个model对象,必须先自己创建初始化一个UIBarButtonItem对象,然后赋值给source ViewController(这里的test1)才能起作用,这里要提到一点,backBarButtonItem只能自定义image和title属性,无法自定义处理事件。另外,在研究backBarButtonItem的过程中还发现了一个以前没有注意到的小问题,卖个关子,在最后的结论中再分享给大家(可能很多人都没有注意到)。

   但是,假如test1中不设置backBarButtonItem,test2中也不设置leftBarButtonItem,如果test1有self.title,那么跳转后test2左上角显示<+test1.title,否则显示"<back",而此时无论test1还是test2的self.navigationItem.backBarButtonItem与self.navigationController.navigationItem.backBarButtonItem,都是nil,系统是怎么判断的呢?不得而知,忘知情者留言相告,不胜感激。

    总结,本文简要结论如下:

  1. self.navigationController.navigationItem 和self.navigationItem不是同一个东西,要设置导航栏显示属性,请使用self.navigationItem。
  2. 从MVC的思路来看,navigationItem本质为一个数据模型,类似的还有tabBarButtonItem(其实所有item结尾的基本都可以这么理解)。
  3. 自定义backBarButtonItem时存在字符数限制,数字最多显示11位,汉字最多显示6位,超过了则显示为系统默认的"<back"。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值