美文网首页
iOS-个人整理05 - 应用程序的启动流程--视图控制器Vie

iOS-个人整理05 - 应用程序的启动流程--视图控制器Vie

作者: 简单也好 | 来源:发表于2016-04-11 21:32 被阅读190次

    一、应用程序启动流程

    main函数中的操作
    创建整个应用程序
    创建整个应用程序的代理
    指定应用程序的代理
    把应用程序放在RunLoop中,等待--处理--等待
    再执行
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    int main(int argc, charchar * argv[]) {  
        @autoreleasepool {  
            //配置应用的一个main函数  
            //前面两个参数是启动必要的数据,系统自己配置  
            //第三个参数:将应用程序的类名转换为字符串作为该函数的参数,如果赋值为nil,意味着默认值为@”UIApplication",这个参数可以是UIApplication的子类,这个参数就是应用对象  
            //第四个参数:创建了应用的代理  
            //当应用程序对象和代理对象创建完成后,将二者建立关联,也就是应用程序将代理对象指定为整个应用程序的代理,协助应用程序处理逻辑操作  
            //当应用程序和代理对象建立关联后,会将整个应用程序放入RunLoop中,不退出就会一直循环运行。他有三种状态, 等待状态-》接到操作-》处理操作-》等待状态  
              
            NSLog(@"delegate - - -- %@",NSStringFromClass([AppDelegate class]));  
              
            //此函数在内部根据字符串创建该字符串类型的对象所需的方法,将及辅材转换为类  
            NSClassFromString(@"AppDelegate");  
              
            return UIApplicationMain(argc, argv, NSStringFromClass([UIApplication class]), NSStringFromClass([AppDelegate class]));  
        }  
    }  
    

    进入代理后方法的执行

    
    //  
    //  AppDelegate.m  
      
    #import "AppDelegate.h"  
    #define A 1000  
    #define myMAX(A,B) ((A)>(B)?(A):(B))  
    //宏定义的参数要加括号,返回值也要加括号  
    #define RGBA(r,g,b,a) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:(a)]  
      
    //宏定义截取字符串  
    #define sub(a,b) [(a) substringToIndex:(b)];  
      
    @interface AppDelegate ()  
      
    @end  
      
    @implementation AppDelegate  
      
    //当main函数执行完,应用程序创建好了,应用的代理也指定为当前类的对象,这时当前类的对象也将应用放到了RunLoop中,这时整个应用程序才算加载完毕。当应用程序加载完毕,就调用此代理方法,进行界面设置  
      
    //告诉delegate程序启动即将完成,程序准备要运行。(delegate实现这个方法时,要创建window对象,将程序内容通过window呈现给用户)  
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];  
        // Override point for customization after application launch.  
        self.window.backgroundColor = [UIColor whiteColor];  
        [self.window makeKeyAndVisible];  
          
        return YES;  
    }  
      
    //应用暂停时使用,取消活跃状态  
    - (void)applicationWillResignActive:(UIApplication *)application {  
       //打印方法  
        NSLog(@"fuc1 = %s",__func__);  
    }  
      
    //程序已经进入后台,一般我们将一些重要数据进行保存,因为苹果应用进入后台之后,如果长时间不操作,就会推出  
    - (void)applicationDidEnterBackground:(UIApplication *)application {  
         
        NSLog(@"fuc2 = %s",__func__);  
    }  
      
    //程序即将进入前端,应用变得活跃,此方法中,需要将刚才暂停的一些操作重新开启  
    - (void)applicationWillEnterForeground:(UIApplication *)application {  
          
         NSLog(@"fuc2 = %s",__func__);  
    }  
      
    //程序已经变得活跃  
    - (void)applicationDidBecomeActive:(UIApplication *)application {  
          
    }   
    //程序将要退出  
    - (void)applicationWillTerminate:(UIApplication *)application {  
        NSLog(@"exit");  
    }  
    @end  
    

    一个帮助理解的练习:用自定义的类做应用程序的代理
    1.创建一个类继承于UIResponder
    2.遵守UIApplicationDelegate协议
    3.实现协议方法(实现一个didFinish方法,里面写个nslog打印就行)
    4.在main.m文件的main方法里 return UIApplicationMain(argc, argv, nil, )NSStringFromClass([TestResponder class])); 在这个指定应用程序代理类为自定义的类(TestResponder)

    二、ViewController的加载流程

    之前我们所有的View都是写在Appdelegate.m的launch函数里的,这样显然不方便,太臃肿,系统给我们生成的模板就有一对ViewController文件,在其中对视图进行具体操作。
    而我们要在Appdelegate.m里创建视图控制器对象,作为window的根视图控制器。
    视图控制器是应用程序数据和视图直接的重要桥梁,每个IOS程序只显示一个用户界面,显示的内容是由控制器或一组视图控制器协调管理的,所有视图控制器提供了一个基本的框架来构建应用程序。

    首先command+N创建一个ViewController类,继承于UIViewController。

    然后在Appdelegate.m,导入ViewController类,在launch函数中创建一个ViewController对象,并把他设置为window的根视图控制器
    ViewController作为视图控制器会自动创建一个底层ViewView

    import "ViewController.h"

    ViewController *firstVC = [[ViewController alloc]init];    //生命周期开始    self.window.rootViewController = firstVC;
    

    这时运行程序会自动将ViewController.view加载到self.window上

    在ViewController.m中,有多种方法,表示了一个View的产生到结束的过程
    loadView(加载视图)--->
    viewDidLoad(加载完毕)--->
    viewWillAppear(即将出现)--->
    viewDidAppear(已经出现)--->
    viewWillDisAppear(即将消失)--->
    viewDidDisAppear(已经消失)

    一般我们将视图的控件写在ViewController.m的viewDidLoad()方法里面

    //视图加载完毕  
    -(void)viewDidLoad  
    {  
        //父类的viewDidLoad  
        [super viewDidLoad];  
         
        //创建Label  
        UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(40, 200, 80, 40)];  
        label.text = @"文本框";  
          
        //创建button  
        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];  
        btn.backgroundColor = [UIColor greenColor];  
        [btn setTitle:@"ok" forState:UIControlStateNormal];  
        btn.frame = CGRectMake(150, 300, 80, 40);  
        [btn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];  
        [btn addTarget:self action:@selector(btnAction:) forControlEvents:UIControlEventTouchUpInside];  
          
        //创建TextField  
        UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(100, 200, 200, 40)];  
        text.borderStyle = UITextBorderStyleRoundedRect;  
          
        //把控件添加到View上  
        [self.view addSubview:text];  
        [self.view addSubview:btn];  
        [self.view addSubview:label];  
         
    }  
    

    效果如图


    三、MVC架构

    MVC就是model(数据模型),View(视图),Control(控制)的简写。
    视图和数据模型通过Control模块进行交互,二者不直接交互。
    这样结构的好处是数据和视图显示可以分离,结构更加清晰,两部分可以分开写,耦合性低,修改视图不会影响数据,反之亦然
    盗图一张


    所以之后我们的工程目录结构就是这样的



    RootViewController作为视图控制器,继承的是UIViewController,也可以理解为MVC架构中的Control,在这里面进行接收数据,在视图上显示数据的功能
    其余的TouchView等文件就是视图文件,继承的是UIView,也就是MVC中的View,我们在其中进行控件的设置和布局。
    在以后学习到.xib文件的时候,会更方便,这是后话。

    相关文章

      网友评论

          本文标题:iOS-个人整理05 - 应用程序的启动流程--视图控制器Vie

          本文链接:https://www.haomeiwen.com/subject/xfuilttx.html