• 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,如果有错,还望不吝赐教。

  • 相关阅读:
    Java高并发8-计算机内存模式以及volatile,sychronized工作原理
    Java高并发7-inheritableThreadLocal实现父子线程变量同步原理
    Java高并发6-ThreadLocal内部各种方法实现原理
    Java高并发5-守护线程、ThreadLocal和死锁四个必要条件
    Java高并发4-解析volatile关键字
    AQS详解,并发编程的半壁江山
    Java 调用File的delete方法删除文件返回false
    Java 将文件夹打成压缩包 zip
    前端 文件夹上传 解决方案
    ORA-00904: "FILED_TYPE": 标识符无效
  • 原文地址:https://www.cnblogs.com/ios-mengxiang/p/4358042.html
Copyright © 2020-2023  润新知