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 设 ...
随机推荐
- Yii源码阅读笔记(三十一)
Widget类中开始,获取视图对象,获取widget ID,渲染视图,获取路径方法注释: private $_id; /** * Returns the ID of the widget. * 返回插 ...
- Thinking in Java——笔记(12)
Error Handling with Exceptions The ideal time to catch an error is at compile time, before you even ...
- 如何给main传参数
main 函数的参数有连个argc argcv[] argc 是参数个数 argcv是参数的数组指针,且argcv的第一个参数是默认程序路径加程序名 给main传参数,需要在命令行启动程序时设置 如 ...
- QuicKHit
public class Level { private int levelNo;// 各级别编号 private int strLength;// 各级别一次输出字符串的长度 private int ...
- 升级到macOS 10.12 mysqlb报错ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
系统升级到macOS 10.12后启动mysql后,在终端输入mysql 报错ERROR 1045 (28000): Access denied for user 'root'@'localhost' ...
- CSS定位的三种机制:普通流、绝对定位和浮动
1.普通流: position : static – 元素框正常生成.即上述不对元素进行任何样式设置的默认形态. position : relative (此时设置top, right, bottom ...
- PHP会话管理:cookie和session
PHP会话管理1.cookie数据存储在浏览器端方便与JavaScript交换数据方便获取用户信息风险-浏览器可能会禁用cookie替代方案-URL参数 2.session数据存储在服务器高效.安全. ...
- 16C554(8250)驱动分析
参考: http://www.cnblogs.com/zym0805/p/4815041.html 一. 硬件数据手册 The ST16C554D is a universal asynchronou ...
- 【搬运】systemctl 命令完全指南
Systemctl是一个systemd工具,主要负责控制systemd系统和服务管理器. Systemd是一个系统管理守护进程.工具和库的集合,用于取代System V初始进程.Systemd的功能是 ...
- redhat note
1,iptables -I INPUT 5 -m state --state NEW -p tcp --dport 80 -j ACCEPT