ViewController是iOS應(yīng)用程序中重要的部分产徊,是應(yīng)用程序數(shù)據(jù)和視圖之間的重要橋梁,ViewController管理應(yīng)用中的眾多視圖比庄。 iOS的SDK中提供很多原生ViewController俏站,以支持標(biāo)準(zhǔn)的用戶界面韭脊,例如表視圖控制器(UITableViewController)、導(dǎo)航控制器(UINavigationController)、標(biāo)簽欄控制器(UITabbarController)和iPad專有的UISplitViewController等拦赠。
按結(jié)構(gòu)可以對iOS的所有ViewController分成兩類:
1巍沙、主要用于展示內(nèi)容的ViewController,這種ViewController主要用于為用戶展示內(nèi)容荷鼠,并與用戶交互句携,如UITableViewController,UIViewController允乐。
2矮嫉、用于控制和顯示其他ViewController的ViewController。這種ViewController一般都是一個ViewController的容器牍疏。如UINavigationController蠢笋,UITabbarController。它們都有一個屬性:viewControllers鳞陨。其中UINavigationController表示一種Stack式結(jié)構(gòu)昨寞,push一個ViewController或pop一次,因此后一個ViewController一般會依賴前一個ViewController厦滤。而UITabbarController表示一個Array結(jié)構(gòu)援岩,各個ViewController是并列的。
ViewController使用
UIViewController可以使用兩種方式創(chuàng)建馁害,1窄俏、xib方式,2碘菜、代碼方式
1)xib方式
Command+N 新建文件凹蜈,選Cocoa Touch UIViewController subclass,SubClass of UIViewController,勾選with XIB for user interface。定義ViewController名字是MainViewController,最終生成MainViewController.h MainViewController.m MainViewController.xib三個文件忍啸。在AppDelegate.m文件的
didFinishLaunchingWithOptions方法中加載xib文件仰坦。
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
MainUIViewController *vc=[[MainUIViewController alloc]initWithNibName:@"MainUIViewController" bundle:nil];
self.window.rootViewController=vc;
[self.window makeKeyAndVisible];
return YES;
加載xib文件后,在xib文件拖拽幾個控件可看到效果计雌。
2)代碼創(chuàng)建
Command+N 新建文件UIViewController文件悄晃,在AppDelegate.m文件的didFinishLaunchingWithOptions方法中使用。在UIViewController的loadView方法中使用代碼創(chuàng)建view凿滤。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
//? ? MainUIViewController *vc=[[MainUIViewController alloc]initWithNibName:@"MainUIViewController" bundle:nil];
//? ? self.window.rootViewController=vc;
RootViewController *rc=[[RootViewController alloc] init];
self.window.rootViewController=rc;
[self.window makeKeyAndVisible];
return YES;
}
創(chuàng)建View
- (void)loadView{
[super loadView];
UIView *view=[[UIView alloc]initWithFrame:[UIScreen mainScreen].applicationFrame];
view.alpha=0.5;
view.backgroundColor=[UIColor cyanColor];
self.view=view;
}
ViewController的生命周期
前面寫了iOS應(yīng)用程序的生命周期妈橄,這里會寫到ViewController的生命周期,這個更像Android的Activity的生命周期(見文章最后的圖)翁脆。ViewController生命周期會經(jīng)歷初始化眷蚓、加載視圖、銷毀視圖反番、生命結(jié)束等過程沙热。
1)init方法
初始化ViewController本身叉钥。
2)loadView方法
當(dāng)view需要被展示而它卻是nil時,viewController會調(diào)用該方法篙贸。
如果代碼維護(hù)View的話需要重寫此方法投队,使用xib維護(hù)View的話不用重寫。
3)viewDidLoad方法
執(zhí)行完loadView后繼續(xù)執(zhí)行viewDidLoad爵川,loadView時還沒有view敷鸦,而viewDidLoad時view已經(jīng)創(chuàng)建好了。
4)viewDidUnload方法
當(dāng)系統(tǒng)內(nèi)存吃緊的時候會調(diào)用該方法雁芙,內(nèi)存吃緊時轧膘,在iPhone OS 3.0之前didReceiveMemoryWarning是釋放無用內(nèi)存的唯一方式,但是OS 3.0及以后viewDidUnload方法是更好的方式兔甘。
在該方法中將所有IBOutlet(無論是property還是實例變量)置為nil(系統(tǒng)release view時已經(jīng)將其release掉了)谎碍。
在該方法中釋放其他與view有關(guān)的對象、其他在運行時創(chuàng)建(但非系統(tǒng)必須)的對象洞焙、在viewDidLoad中被創(chuàng)建的對象蟆淀、緩存數(shù)據(jù)等。
一般認(rèn)為viewDidUnload是viewDidLoad的鏡像澡匪,因為當(dāng)view被重新請求時熔任,viewDidLoad還會重新被執(zhí)行。
5)dealloc
釋放其他資源或內(nèi)存唁情。