一、视图之间的简单切换。
视图之间的切换实质是视图控制器之间的切换,因为试图控制器(UIViewController)上面都有视图(view),试图控制器切换了,视图自然就实现了切换。
新建一个工程,创建两个类FirstViewController和SecondViewController,它们的父类都是UIViewController,还有工程里自带的ViewController,一共三个视图控制器。
在每个类里面,即在这里的每个试图控制器里都写一个如下所示touch方法,这个方法是点击屏幕就能调用,以便我们调试程序。
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ }
再来设置一下每个视图的背景颜色,就可以了,也是为了方便调试。
1、如果要实现ViewController到FirstViewController切换,首先在ViewController中引入FirstViewController的头文件。
ViewController.m里面代码:
- (void)viewDidLoad {
[super viewDidLoad];
self.view.bacgroundColor=[UIColor whiteColor];//设置成白色
}
//点击屏幕调用此方法
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
FirstViewController * firstVC=[[FirsttViewController alloc]init];
[self PResentViewController:firstVC animated:YES completion:^{
NSLog(@"present成功,从ViewController切换到FirstViewController");//此方法调用了会执行这行代码
}];
}
这样就可以了,但是这样的话从FirstViewController就回不到ViewController了,所以要在FirstViewController.m里写如下方法了。在FirstViewController里面引入ViewController头文件。
- (void)viewDidLoad {
[super viewDidLoad];
self.view.bacgroundColor=[UIColor redColor];//设置成红色
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
[self dismissViewControllerAnimated:YES completion:^{
NSLog(@"dismiss成功,从FirstViewController返回到ViewController");
}];
}
这就实现了从ViewController到FirstViewController得来回转换了。
总结:要实现视图之间的切换,要在两个视图控制器中分别写如下两个方法。
presentViewController: animated: completion:
dismissViewControllerAnimated: completion:
这两个方法一般是一起使用,才能实现两个视图之间的来回切换。我们暂且说成一个present方法,一个dismiss方法。
2、模态视图
视图控制器有一个presentModalViewController:的方法,该方法可以实现视图切换,从当前视图跳转到下一个视图,通过此方法弹出的视图我们都称为模态视图,模态视图是手机上非常常见。此方法如下:
[self presentModelViewController: animated: completion:^{}];
模态视图出现的场景一般是临时弹出的窗口,譬如:登陆窗口。
模态视图弹出时通过modalTransitionStyle属性设置不同的动画效果 。
调用dismissModalViewControllerAnimated: 方法关闭窗口。
示例代码和上述大致一样,只是模态视图弹出时通过modalTransitionStyle属性设置不同的动画效果。将上述调用的方法稍作修改就可以了。
ViewController.m中
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
FirstViewController *firstVC = [[FirstViewController alloc] init];
firstVC.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;//设置视图弹出时的动画效果
[self presentModalViewController:firstVC animated:YES];
}
然后在FirstViewController.m中调用
[self dismissModelViewControllerAnimated: completion:^{ }];
3、以上两种情况都是实现了试图控制器之间的直接切换,中间没有什么其他东西。下面我们说如果存在导航栏控制器(UINavigationController)的情况下如何实现视图切换。
可以在story.board里拽一个UINavigationController,把它的根视图设置成ViewController,将story.board里is initial View Controller勾选√,让程序的入口从导航栏控制器进入。
其他的和1里一样。只是调用的方法有所改变,有导航栏控制器的情况下,调用的方法是:
ViewController.m中
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
FirstViewController *firstVC = [[FirstViewController alloc] init];
[self.navigationController pushViewController:firstVC animated:YES];
}
这样就行了,即使在FirstViewController.m中不写方法,程序运行也会自带有一个按钮返回ViewController。如图:
点击Back就自动返回到上一级了。
但是也可以写一个返回方法,系统是这个方法,写不写的区别在下面补充里面,个人觉得还是挺重要的关于这一点。
[self.navigationController pop...];建议自己尝试一下。所以这里所用的方法总结下就是一个push,一个pop。
补充:
首先说一下UINavigationController有一个属性就是viewControllers,它是一个数组,存储导航栏控制器的所有视图控制器,也就是一个navigationController所有的viewController都在viewControllers里面。
在没有push到FirstViewController里面的时候,FirstViewController并不是navigationController的子控制器,当push到FirstViewController后,navigationController就新添加了一个子控制器FirstViewController。viewControllers里也就有了FirstViewController。如果不用pop方法pop回去的话,FirstViewController的navigationController就存在了,但使用了pop方法pop回去的话就又释放掉了,navigationControllerd的viewControllers也就没有FirstViewController了。
注意:push和pop方法都是navigationController的方法,调用时候,一般用[self.navigationController ...];
这就解释了为什么一个导航栏控制器只有一个根控制器,其他的控制器是怎么添加上,怎么去除的了。
最后,为什么没用到SenconedViewController呢?留着自己再做做实验吧。
初学iOS,如果有错,还望不吝赐教。
新闻热点
疑难解答