你的位置:首页 > 操作系统

[操作系统]iOS 模态视图,视图之间的切换


一、视图之间的简单切换。 

 视图之间的切换实质是视图控制器之间的切换,因为试图控制器(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,如果有错,还望不吝赐教。