leftBarbuttonItem/rightBarButtonItem和leftBarbuttonItems/rightBarButtonItems相关问题
仿写项目的时候,出现了一个Bug:点击右边的"编辑","编辑"变为"完成",左侧出现"全选","删除"等按钮,再点击"完成",本应该把左侧出现的按钮都隐藏掉,并把"完成"再次改为"编辑",但是左侧的按钮并没有隐藏掉.
正确的需求应该如下图所示:

出现Bug的效果图:

有Bug的核心代码部分如下:
//右侧按钮点击事件
- (void)rightClick:(UIBarButtonItem *)item{
if ([item.title isEqualToString:@"编辑"]) {
item.title = @"完成";
//左侧显示 返回 全选 全不选 删除
self.navigationItem.leftBarButtonItems = @[self.backItem,self.selectAllItem,self.unselectAllItem,self.deleteItem]; }else{
item.title = @"编辑";
//左侧只显示 返回
self.navigationItem.leftBarButtonItem = self.backItem; }
//刷新
[self.collectionView reloadData];
}
一进入控制器就设置navigationItem的代码部分:
- (void)setUpNav{
//设置左侧
self.navigationItem.leftBarButtonItem = self.backItem;
//设置右侧
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"编辑" style:UIBarButtonItemStylePlain target:self action:@selector(rightClick:)];
//标题
self.title = @"收藏";
}
将所有的leftBarButtonItem改为leftBarButtonItems,即使只有一个元素,也写作Items,bug就不见了,代码如下图(为了突出重点,选择截图做展示)

个人总结:在设置UINavigationBar过程中,只要一个地方需要使用left/rightBarButtonItems,那么就把所有的地方都写成left/rightBarButtonItems.
个人推理(非官方,如果有错欢迎指正),因为left/rightBarButtonItems和left/rightBarButtonItem是navigationItem的两个独立的属性,并且如果遇到二者都有值的时候,数组(left/rightBarButtonItems)的优先级可能要比left/rightBarButtonItem的优先级高一些.编译器会优先选择left/rightBarButtonItems中的元素来布局.
查看苹果官方头文件UINavigationBar.h,相关语句红框圈出:

The older single properties (leftBarButtonItem and rightBarButtonItem) now refer to the first item in the respective array of items.
翻译(不专业,但大体意思应该没错):之前的单数属性(leftBarButtonItem 和 rightBarButtonItem)现在指各自的items数组中的首个元素.
NOTE: You'll achieve the best results if you use either the singular properties or the plural properties consistently and don't try to mix them.
翻译概述(不专业,但大体意思应该没错):NOTE:想要得到最好的结果,最好要么一直用单数属性要么一直用复数属性,不要试图把他们混起来用.
(原创,转载请注明出处.有错误的地方欢迎指正.)
leftBarbuttonItem/rightBarButtonItem和leftBarbuttonItems/rightBarButtonItems相关问题的更多相关文章
- UINavigationController 返回手势与 leftBarButtonItem
UINavigationController 返回手势与 leftBarButtonItem UINavigationController 自带从屏幕左侧边缘向右滑动的返回手势,可以通过这个手势实现 ...
- UINavigationController的使用
1.UINavigationController使用流程 UINavigationController为导航控制器,在iOS里经常用到. 我们看看它的如何使用: 下面的图显示了导航控制器的流程.最左侧 ...
- IOS开发UI篇-NavigationController的基本使用
一.简介 一个iOS的app很少只由一个控制器组成,除非这个app极其简单 当app中有多个控制器的时候,我们就需要对这些控制器进行管理 有多个view时,可以用一个大的view去管理1个或者多个小v ...
- iOS学习—— UINavigationController的返回按钮与侧滑返回手势的研究
侧滑返回手势是从iOS7开始增加的一个返回操作,经历了两年时间估计iPhone用户大部分都已经忽略了屏幕左上角那个碍眼的back按钮了.之前在网上搜过有关侧滑手势的技术博客,发现大多比较散乱,甚至有很 ...
- 01-QQ 3-最终重构版
Demo示例程序源代码
源代码下载链接:01-QQ 3.zip292.5 KB // QQAppDelegate.h Map // // QQAppDelegate.h // 01-QQ // // Created ...
- NAVagationController
UINavigationController为导航控制器,在iOS里经常用到. 1.UINavigationController的结构组成 UINavigationController有Navigat ...
- iOS 底层框架的浅析
1.简介 IOS是由苹果公司为iPhone.iPod touch和iPad等设备开发的操作系统. 2.知识点 iPhone OS(现在叫iOS)是iPhone, iPod touch 和 iPad 设 ...
- IOS计划 分析
1.基本介绍 IOS苹果公司iPhone.iPod touch和iPad操作系统和其他设备的发展. 2.知识点 1.IOS系统 iPhone OS(现在所谓的iOS)这是iPhone, iPod to ...
- iOS底层框架浅析
1.简介 IOS是由苹果公司为iPhone.iPod touch和iPad等设备开发的操作系统. 2.知识点 iPhone OS(现在叫iOS)是iPhone, iPod touch 和 iPad 设 ...
随机推荐
- [计算机故障]windows8+IE11显示无法登陆网页
同事的一款SURFACE,跑的WINDOWS 8.1.最近发现从开始菜单里的win8.1的浏览器可以上网,但是通过任务栏的快捷方式,又上不了网.尝试重置了IE11,安装了Google Chrome.但 ...
- 好程序与差程序Good Programming, Bad Programming
好程序与差程序 Good Programming, Bad Programming 发布时间: 2012-11-20 16:32:21| 阅读数:2,735 views 优秀的程序可以使复杂的东西看起 ...
- Oracle数据库的导入导出
1.导出Oracle数据 A.使用命令行导出数据 exp username/password @database file= fullpath(如:D:\data.dmp) full=y B.使用工具 ...
- Tiddlywiki 维基程序使用手册
文档 http://tiddlywiki.com/ http://web.nlhs.tyc.edu.tw/~lss/wiki/TiddlyWikiTutorialTW.html https://sit ...
- ADO.Net读取器获取数据库数据
string str = Configuration.ConfigurationManager.AppSettings[str].ToString(); string sql = "sele ...
- 使用Java开发高性能网站需要关注的那些事儿
无论大型门户网站还是中小型垂直类型网站都会对稳定性.性能和可伸缩性有所追求.大型网站的技术经验分享值得我们去学习和借用,但落实到更具体的实践上并不是对所有网站可以适用,其他语言开发的网站我还不敢多说, ...
- 阿里云服务器Linux CentOS安装配置(三)yum安装mysql
阿里云服务器Linux CentOS安装配置(三)yum安装mysql 1.执行yum安装mysql命令:yum -y install mysql-server mysql-devel 2.启动mys ...
- UIKit的外观属性及方法汇总
本文授权转载,作者:楚天舒(简书) 开发中经常会碰到要设置UI的某个生僻的外观属性,虽然在头文件中都能查到,但一是每个控件的头文件比较分散繁杂,二是每个头文件里有太多不用到的方法和属性,所以这里将UI ...
- sql注入漏洞
在这么多bug里给我印象最深的就是sql注入漏洞,看上去没有问题的代码却会因为用户的不正常输入而带来极其严重的问题. 现在给大家分享一下如何修复SQL注入漏洞.下面是网上的两种解决方法,其中第二方法有 ...
- mysql小结
1.使用密码登录mysql mysql -u root -p 2.查看所有的数据库 show databases; 3.创建数据库 create database <数据库名>; 4.创建 ...