這篇知識很重要,最好全掌握:
知識點:
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; }
【iOS開發-UI (四)UIViewController】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!