您的位置:首页 > 产品设计 > UI/UE

正确理解Navgation的BackItem

2012-08-10 17:18 337 查看
假如从A视图控制器进入B视图控制器(self指的是AController,BController指的B)

UINavigationController Class Reference发现使用pushViewController切换到下一个视图时,navigation controller按照以下3条顺序更改导航栏的左侧按钮。
1、如果B视图有一个自定义的左侧按钮(leftBarButtonItem),则会显示这个自定义按钮,矩形非尖角的;

2、如果B没有自定义按钮,但是A视图的backBarButtonItem属性有自定义项,则显示这个自定义项,[b]样式是尖角的


3、如果前2条都没有,则默认显示一个后退按钮,后退按钮的标题是A视图的标题。这个按钮的样式是尖角的。[/b]

按照这个解释,如果要达到修改backItem的目的,则修改的代码应该放在A视图的pushViewController语句之前。

UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithTitle:@"back" style:UIBarButtonItemStyleBordered target:nil action:nil];
[self.navigationItem setBackBarButtonItem:backItem];//修改的是A的navigationItem
[backItem release];
[self.navigationController pushViewController:BController animated:YES];//一定要在push之前修改哦。

还有一个问题也在这里说出来探讨一下吧. 大家有没有留意过一个现象,就是我们使用或者修改navgationbar的时候,是self.navigationController.navigationBar,而修改item的时候使用的是self.navigationItem。

这个现象说明一个什么问题呢?

就是,navgationcontroller在一个层次视图管理结构中是唯一的,它负责管理了视图的栈。也就是说,所有使用self.navigationController的属性,比如self.navigationController.navigationBar,这种修改或者使用对于整个视图栈都是具有全局性的,再具体一点到一个控件上,就是说navigationbar是唯一的。
相似的理解,那么使用self.navigationItem的地方就意味着修改的是self的一个属性,也就意味着navigationItem只是当前视图的一个属性而已。那么,也就意味着每一个视图都有着自己独立的navigationItem。通过在xcode4.4,打印日志验证,也确实如此。只是不知道是否所有版本是统一的。

日志如下:

 main:<UINavigationItem: 0x6b912b0>

 main:<UINavigationController: 0x6b82630>

 main:<UINavigationBar: 0x6b90620; frame = (0 20; 320 44); autoresize = W; layer = <CALayer: 0x6b90710>>

 second:<UINavigationItem: 0xde6f470>

 second:<UINavigationController: 0x6b82630>

 second:<UINavigationBar: 0x6b90620; frame = (0 20; 320 44); autoresize = W; layer = <CALayer: 0x6b90710>>

点击返回之后再次跳转到second,又会随着新的controller的生成而生成新的navigationItem。

 second:<UINavigationItem: 0x6b92dd0>

 second:<UINavigationController: 0x6b82630>

 second:<UINavigationBar: 0x6b90620; frame = (0 20; 320 44); autoresize = W; layer = <CALayer: 0x6b90710>>

navigationitem是继承自NSObect,充当的是一个容器的作用,可以用来在navgationbar显示标题,左右按钮等等。

剩下的还有一些关于buttonItem的推理,留给大家自己去思考吧。留点空间给大家。吼吼~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息