您的位置:首页 > 产品设计 > UI/UE

iOS开发-UI (四)UIViewController

2017-01-18 00:28 253 查看
这篇知识很重要,最好全掌握:

知识点:

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: