iOS初学历程

UINavigationController

2019-07-31  本文已影响0人  水无月之痕

1.当要切换的各个屏幕之间没有相互依存的关系时,UITabBarController对象可以很好地完成任务。
2.但是当多个屏幕互有关联时,就要使用UINavigationController对象

当某个应用通过UINavigationController对象显示多个屏幕的信息时,相应的UINavigationController对象会以栈的形式保存所有屏幕的信息。这里的栈是一个数组对象,保存的都是UIViewController对象。一个UIViewController对象的视图对应一个屏幕。只有位于栈顶的UIViewController对象,其视图才是可见的。

初始化UINavigationController对象时,需要传入一个UIViewController对象。这个UIViewController对象将成为UINavigationController对象的根视图控制器(rootviewcontroller),且根视图控制器将永远位于栈底。应用可以在运行时向UINavigationController的栈压入更多的视图控制器。

UINavigationController对象的栈

UINavigationController是UIViewController的子类,所以UINavigationController对象也有自己的视图。该对象的视图有两个子视图:一个是UINavigationBar对象,另一个是topViewController的视图。

Homepwner应用对象图

针对XIB文件中的每一个UITextField对象,将其delegate属性关联至File'sOwner(按住Control,从UITextField对象拖曳至File'sOwner,然后选择弹出菜单中的delegate)

凡是加入了某个UINavigationController对象的栈的视图控制器,都可以向自己发送navigationController消息,以得到指向该对象的指针。

UINavigationController对象的根视图控制器对象,一直停留在栈中,总能得到指向相应UINavigationController对象的指针。
使用UINavigationController对象时,经常会由当前处于栈顶的视图控制器来负责压入另一个视图控制器,这是常见的使用模式。

视图控制器之间的数据传递

当要在多个视图控制器之间传递数据时,很多刚接触iOS开发的初学者可能会无从下手。Homepwner使用了一种简单高效的解决方案:由根视图控制器保存所有的数据,然后将数据的子集传给下一个视图控制器。

当某个视图收到endEditing:消息时,如果该视图(或者其下的任何子视图)是当前的第一响应对象,就会取消自己的第一响应对象状态,而且虚拟键盘也会关闭(传入的参数代表是否需要强制取消第一响应对象状态。某些第一响应对象可能会拒绝退出状态,传入YES可以强制其退出)。

//刷新tableview 数据
[self.tableView reloadData];

UIViewController对象有一个名为navigationItem的属性,类型为UINavigationItem。和UINavigationBar不同,UINavigationItem不是UIView的子类,不能在屏幕上显示。UINavigationItem对象的作用是为UINavigationBar对象提供绘图所需的内容。当某个UIViewController对象成为UINavigationController的栈顶对象时,UINavigationBar对象就会访问该UIViewController对象的navigationItem,获取和界面显示有关的内容。
 UINavigationItem对象默认是“空”的。要让UINavigationBar对象能够显示最基本的信息,可以为UINavigationItem对象设置一个简单的标题(title属性)。当应用将某个UIViewController对象移至UINavigationController对象的栈顶时,UINavigationBar对象就会访问UIViewController对象的navigationItem属性,查看相应的title属性是否指向有效的NSString对象。如果是,就会在UINavigationBar对象的正中显示该字符串


UINavigationItem 设置了各种界面属性的UINavigationItem对象

类似于UINavigationItem,UIBarButtonItem也不是UIView的子类。UINavigationItem对象封装了一些设置信息,以便UINavigationBar在运行时可以正确显示该对象。同样,UIBarButtonItem对象封装了关于如何在UINavigationBar显示单个按钮的信息,UINavigationBar对象会根据UIBarButtonItem对象中的信息显示相应的按钮。(UIToolbar与UINavigationBar一样,也是通过UIBarButtonItem对象来显示按钮的。)
除了leftBarButtonItem和rightBarButtonItem,UIBarButtonItem对象的第三个界面属性是titleView。UINavigationBar对象包含两种标题显示模式。第一种模式是前面介绍过的:显示一个简单的字符串。第二种模式是在UINavigationBar对象正中显示一个视图。两种模式不能共存。如果需要在UINavigationBar对象正中显示复杂的界面,就可以先创建拥有自定义视图(例如UIButton对象、UISlider对象、UIImageView对象甚至MKMapView对象)的视图控制器,然后为该对象的titleView赋值,并指向这个自定义视图。上面的图中的UINavigationItem对象为例,该对象的titleView属性指向的就是一个自定义视图。通常情况下,使用第一种模式就可以了。

navItem.leftBarButtonItem=self.editButtonItem;

只需编写一行代码,向BNRItemsViewController对象发送editButtonItem消息,就能得到可以加入UINavigationBar对象的Edit(编辑)按钮。构建并运行应用,点击“编辑”按钮,UITableView对象会进入编辑模式。UIViewController对象有一个名为editButtonItem的属性,当该对象收到editButtonItem消息后,如果editButtonItem属性的值是nil,就会创建一个标题为“编辑”的UIBarButtonItem对象。此外,editButtonItem方法所返回的UIBarButtonItem对象默认已经设置好了目标动作对。当用户点击对应的按钮时,包含该对象的UIViewController对象就会收到setEditing:animated:消息。

上一篇下一篇

猜你喜欢

热点阅读