leftBarbuttonItem/rightBarButtonItem和leftBarbuttonItems/rightBarButtonItems相关问题
仿写项目的时候,出现了一个Bug:点击右边的"编辑","编辑"变为"完成",左侧出现"全选","删除"等按钮,再点击"完成",本应该把左侧出现的按钮都隐藏掉,并把"完成"再次改为"编辑",但是左侧的按钮并没有隐藏掉.
正确的需求应该如下图所示:
出现Bug的效果图:
有Bug的核心代码部分如下:
1 //右侧按钮点击事件 2 - (void)rightClick:(UIBarButtonItem *)item{ 3 if ([item.title isEqualToString:@"编辑"]) { 4 item.title = @"完成"; 5 //左侧显示 返回 全选 全不选 删除 6 self.navigationItem.leftBarButtonItems = @[self.backItem,self.selectAllItem,self.unselectAllItem,self.deleteItem]; 7 8 }else{ 9 item.title = @"编辑"; 10 //左侧只显示 返回 11 self.navigationItem.leftBarButtonItem = self.backItem; 12 13 } 14 //刷新 15 [self.collectionView reloadData]; 16 }
一进入控制器就设置navigationItem的代码部分:
1 - (void)setUpNav{ 2 //设置左侧 3 self.navigationItem.leftBarButtonItem = self.backItem; 4 5 //设置右侧 6 self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"编辑" style:UIBarButtonItemStylePlain target:self action:@selector(rightClick:)]; 7 8 //标题 9 self.title = @"收藏"; 10 11 }
将所有的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:想要得到最好的结果,最好要么一直用单数属性要么一直用复数属性,不要试图把他们混起来用.
(原创,转载请注明出处.有错误的地方欢迎指正.)