正确理解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语句之前。
还有一个问题也在这里说出来探讨一下吧. 大家有没有留意过一个现象,就是我们使用或者修改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的推理,留给大家自己去思考吧。留点空间给大家。吼吼~~
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的推理,留给大家自己去思考吧。留点空间给大家。吼吼~~
相关文章推荐
- 正确理解Navgation的BackItem
- 理解SQLSERVER中的排序规则,解决无法正确显示中文字符的问题
- 正确理解C#中的ref关键字
- 正确理解servlet3.0规范之异步特性
- 正确理解各种编码问题
- 正确理解Python文件读写模式字w+、a+和r+
- 正确理解 LEAL (Load Effective Address) 指令
- 函数指针的正确理解 from C++ Primer Plus P242
- 编写高质量的js之正确理解正则表达式回溯
- 正确理解差异的“专业意义”与“统计学意义”
- [转帖]JAVA中几个易混淆关键词的正确理解
- 正确理解ThreadLocal
- 正确理解ThreadLocal
- ios高效开发-理解属性和正确的使用属性
- LUA元表的正确理解
- 正确理解CSS中的margin合并
- 到底什么是权限?我们应该如何正确理解“权限定义”(请高手指点)
- 正确理解Hibernate的聚合类型(collection)的使用【转】
- 【转】正确理解ThreadLocal
- 对Yii 2.0模型rules的理解(load()无法正确装载数据)