• iOS开发-UI (四)UIViewController


    这篇知识很重要,最好全掌握:

    知识点:

    1.UIViewController基本认识

    2.UIViewController之间的切换

    3.UIViewController生命周期

    4.多个Controller之间的数据如何交换

    =========================

    UIViewController

       1.MVC设计模式

    MVC设计模式:Model模型 View视图 Controller控制器

       2.window需要一个根视图控制器

    RootViewController *rootCtl = [[RootViewController alloc] init];

        

        //设置根视图控制器

        //如果在不更换根视图控制器的情况下,根视图控制器是不会被释放掉的

        self.window.rootViewController = rootCtl;

       3.UIViewController对象默认都会有一个自带的view

    //实例化一个视图控制器

        UIViewController *ctl = [[UIViewController alloc] init];

        //每一个控制器上,都自带了一个UIView

        ctl.view.alpha = 0.5;

        

        //设置控制器自带View的背景色(默认无背景色)

        ctl.view.backgroundColor = [UIColor whiteColor];

        self.window.backgroundColor = [UIColor orangeColor];

       4.UIViewController和UIView的关系  

         1)UIViewController是视图控制器,而UIView是视图,也就是说UIViewController控制UIView 

        2)UIView需要显示的内容(数据)也是要通过UIViewController来管理

         例子:UIViewController就是一个相框,而UIView就是一个相片

           相框可以随时随地的拿走这个相片而换另外一张相片,或者在这张相片上加一个新的相片

           而相片却不能操纵相框 

    =========================

    UIViewController的基本用法

       1.实例化UIViewController 时调用init方法后,会自动跳转到如下方法

    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    
    //控制器的初始化方法
    
    //init - > initWithNibName:nibNameOrNil bundle:
    
    -(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
    
    
        if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
    
            //注意: 不允许执行跟UI有关系的操作,虽然执行有些没报错,但这样既不严格也容易出现一些乱七八糟的问题
    
            //self.view.backgroundColor XXX
    
            //允许执行跟数据有关系的操作
    
            //例如:数组的实例化,字典的实例化等等  
    
        }
        return self;
    
    }

       2.viewDidLoad的作用

         一般我们会在这里做界面上的做一些额外操作,比如往view中添加一些子视图、

         从数据库或者网络加载模型数据装配到子视图中

       3.重写viewDidLoad方法

    =========================

    UIViewController之间的切换

       1.分割功能到不同的Controller页面上

       2.如何管理多个UIViewController之间的切换

         1)切换到新的视图控制器

          - (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion

    //切换到新的控制器

        /*

         参数1:要切换至的控制器对象

         参数2:是否需要动画

         参数3:回调block,一般为nil

         */

        

        //懒加载机制:这个对象需要使用的时候,才会去实例化

        

    [self presentViewController:newCtl animated:YES completion:nil];

         2)关闭当前视图控制器

          - (void)dismissViewControllerAnimated:(BOOL)flag 

            completion:(void (^)(void))completion

    [self dismissViewControllerAnimated:YES completion:nil];

         3)模式切换方式:

    modalTransitionStyle

    UIModalTransitionStyleCoverVertical    从下向上

    UIModalTransitionStyleCrossDissolve      渐变

    UIModalTransitionStyleFlipHorizontal     横向翻转

    UIModalTransitionStylePartialCurl           翻书

    //设置切换的动画效果

        

    newCtl.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;

    =========================

    UIViewController的生命周期

     顺序:

       1.alloc创建对象,分配空间

       2.init初始化对象,初始化数据

       3.LoadView -- self.view创建 

       4.viewDidLoad作用

       5.viewDidLoad何时被调用

       6.viewWillAppear函数

       7.viewDidAppear函数

       8.viewWillDisappear函数

       9.viewDidDisappear函数

       10.dealloc视图被销毁

       //视图即将消失

    例子:

    -(void)viewWillDisappear:(BOOL)animated{
    
        [super viewWillDisappear:animated];
    
        NSLog(@"viewWillDisappear");
    
    }

    =========================

    多个Controller之间的数据如何交换

       

         1.正向传值

    VA —> VB

    传值一方:

    例如RootViewController.m里传值

    NewViewController *newCtl = [NewViewController new];

        

        UILabel *label = (UILabel *)[self.view viewWithTag:100];

      1: newCtl.deliverStr = label.text;

    获取值一方:

       2:  NewViewController.h :  @property (nonatomic,copy)NSString *deliverStr;//接受传递过来的参数

       3:  NewViewController.m: label.text = self.deliverStr;

         2.反向传值

    VA <— VB

    传值一方

    1:typedef void (^blockType)(NSString *);

    @interface NewViewController : UIViewController

    //回调的block

    2:@property (nonatomic,copy)blockType block;

    传值一方

    NewViewController *newCtl = [NewViewController new];

        

        UILabel *label = (UILabel *)[self.view viewWithTag:100];

    //设置block的主体实现

      3:  newCtl.block = ^(NSString *text){

            label.text = text;      

        };

    3.通过AppDelegate对象传值

    1)获取当前应用的sharedApplication对象:

           

    + (UIApplication *)sharedApplication 传值一方
    
    UILabel *label = (UILabel *)[self.view viewWithTag:100];
    
        
    
        //先给AppDelgate的中转变量进行赋值
    
        
    
        //1.获取UIAplication对象
    
        //2.获取AppDelgate对象
    
        //3.赋值
    
        UIApplication *app = [UIApplication sharedApplication];
    
        AppDelegate *del = app.delegate;
    
        del.middleStr = label.text;

           2)获取当前应用的AppDelegate对象:

           @property(nonatomic,assign) id<UIApplicationDelegate> delegate;

    AppDelegate.h 里

    //中转的属性变量

    @property (nonatomic,copy)NSString *middleStr;

    3)强制转换为AppDelegate对象,然后通过该对象的setter和getter传值

    取值一方

    例如在将出现的函数里调用

    -(void)viewWillAppear:(BOOL)animated{
    
        [super viewWillAppear:animated];
    
      
    
        UIApplication *app = [UIApplication sharedApplication];
    
        AppDelegate *del = app.delegate;
    
        //判断不为空
    
        if (del.middleStr.length!=0) {
    
            UILabel *label = (UILabel *)[self.view viewWithTag:100];
    
            label.text = del.middleStr;
    
        }
    
    }

    协议代理传值方法

    先创建一个协议.h文件,即 protocol 文件:内容如

    #import <Foundation/Foundation.h>
    
    @protocol Myprotocol <NSObject>
    
    //代理需要完成的任务
    
    -(void)showInfo:(NSString *)info;
    
    @end

    传值一方:遵守协议

    .h 文件:

    @property (nonatomic,weak)id<Myprotocol> delegate;//指向代理对象

    .m文件:

    //让代理对象执行方法

       

    if ([_delegate respondsToSelector:@selector(showInfo:)]) {
    
            [_delegate showInfo:label.text];
        }  

        //协议代理

        //代理:能完成这个任务的对象

        //被代理:希望完成这个任务,但是本身不能实现的对象

        //设置代理:找到能同时获取到代理和被代理对象的位置

    获取值一方:遵守协议

    .h文件里:

    @interface RootViewController : UIViewController<Myprotocol>

    .m文件里:

    -(void)showInfo:(NSString *)info{
    
        //刷新Label显示的文字内容
    
        UILabel *label = (UILabel *)[self.view viewWithTag:100];
    
        label.text = info;  
    
    }
  • 相关阅读:
    关于两次fork
    阻塞非阻塞与同步异步的区别
    函数调用堆栈
    数组
    64位操作系统与32位操作系统数据类型的字节数
    Redis 键(key)
    Redis 命令
    Redis 安装
    Redis 配置
    MongoDB 安装
  • 原文地址:https://www.cnblogs.com/fcug/p/6295316.html
Copyright © 2020-2023  润新知