一、视图控制器常见的切换方式。
1、Tabbar选项卡:以UITabbarController为容器,以平行的方式管理试图控制器。
1.1、UITabbarController常用的属性:title---标题,image---图像(需要打开alpha通道,32*32以下,png格式),badgeValue---右上角的图标,viewControllers---所有的子视图控制器。注:UITabbarController在实例化的时候会加载其所有的子视图控制器,如果使用代码方式设置tabbar中的内容,需要在第一个视图控制器中遍历所有的子视图控制器(使用isKindOfClass)。所以当初次进来要显示各个子视图的Badge属性时,应当在第一个视图控制器实例化一下(视图懒加载)。
应用开发中,在tabbarItem可以设置Badge属性来作为有新信息的提示,同时在Appdelegate的didFinishLaunchingWithObjects方法中,通过设置 [application setApplicationIconBadgeNumber:1000], 则当应用挂在后台时,可以提示有多少条新的信息,就像短信的提示功能那样。
2、push推送:以UINaviationController为容器,以栈的形势管理子视图控制器。
2.1这里的栈是先进后出的,UINaviationController始终显示栈顶的视图控制器
2.2、UINaviationController必须要有一个rootViewController,在该方式下,跳转显示新的控制器时一把都是用 [self.navigationController pushViewController: animated: ] 方法.
注意:UINaviationController中的返回按钮是懒加载的,所以要设置返回按钮,需要经过以下操作:
//target和action设置为nil时会默认使用系统自带的操作
self.navigationItem.backBarButton = [[UIBarButton alloc] initWithTitle:@"返回" style:UIBarButtonItemStyleDone target:nil action:nil];
而直接设置[self.navigationItem.backBarButtonItem setTitle:@"返回"];是不起作用的(因为懒加载的存在)
2.3 storyboard中segue对象的生命周期:
(1)、创建目标视图控制器;
(2)、创建segue对象并且调用他的initWithIdentifier:source destination: 方法,其中的标识符是在Interface Builder中指定的唯一标识字符串,另外两个参数分别对应箭头的起始控制器和目标控制器
(3)、调用源视图控制器的preparedForSegue:sender:方法,这是使用连线的时候会调用的方法(modal&push)
(4)、用segue对象的perform方法,负责将目标视图控制器推送到屏幕
(5)、 释放segue对象
2.4、重写返回按钮的方法时,在处理操作完成之后需要通过调用[self.navigationController popViewController animated:] 方法来实现
3、model模态:以模态窗口的方式显示新的视图控制器,新视图控制器关闭前,用户无法与原控制器交互,使用storyboard连线时选用的是modal。
3.1模态窗口是单独使用的窗口,不依赖于容器视图控制器,通常用于显示相对独立的窗口,例如:用户登录,应用程序设置或者帮助信息等,用户在关闭模态窗口前不能与上一级视图进行交互。
3.2模态视图跳转进入时使用方法[self presentViewController: animated: completion:^{}],退出当前模态视图使用[self dismissViewControllerAnimated: completion:^{}];
3.3当在storyboard中,如果按钮直接用segue连线到下一个controller的view时,就算将该按钮与controller连线并且写它的点击事件方法,这个方法是不会被调用的,而会调用segue默认的方法直接跳转到下一个页面。所以,要想使该点击事件的方法起效,应该在Interface Builder中直接将两个controller用modal相连,并且将要跳转到的controller 的identifier设置好,同时在代码中用以下操作来跳转:
[self performSegueWithIdentifier :@"Login" sender:nil];即如果在打开目标控制器前需要做额外的处理,可以使用performSegueWithIdentifier : sender: 方法。此时,因为storyboard中已经定义了Login的视图控制器,所以不能实例化新的LoginViewController,像下面这样的操作是不能跳转的
LoginViewController *logon =[ [LoginVIewController alloc init];
[self presentViewController logon animated:YES];是不会跳转成功的,系统反而会崩溃。