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:想要得到最好的结果,最好要么一直用单数属性要么一直用复数属性,不要试图把他们混起来用.

 

 

(原创,转载请注明出处.有错误的地方欢迎指正.)

posted @ 2017-01-02 23:58  Accepted.DXY  阅读(3299)  评论(0编辑  收藏  举报