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; }