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;  

}

 

posted @ 2017-01-18 00:28  CUG  阅读(690)  评论(0编辑  收藏  举报