IOS裏面採用了MVC的體系結構,在UI方便的具體表現爲View加ViewController。因此UIViewController是IOS應用當中很是經常使用並且很重要的一個類。xcode
一,UIViewController:通常使用都是本身寫一個類繼承UIViewController這個類。在UIViewController裏面有一個很重要的屬性那就是View,也就是這個Controller對應的View,MVC裏面的V和C。能夠經過覆蓋其中的loadView方法來手動建立View而後把它設置到Controller的屬性中。app
除了直接用代碼實例化View之外,還有一種很經常使用的方法,那就是xib文件。xib文件能夠記錄固化的view實例,它是由xcode的interface builder來生成和編輯的。編輯好xib之後也是能夠在controller中將其載入。ide
載入xib須要覆蓋Controller中的:學習
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nil bundle:nil]; if(self != nil) { UITabBarItem *tbi = [self tabBarItem]; [tbi setTitle:@"Time"]; UIImage *img = [UIImage imageNamed:@"Time.png"] ; [tbi setImage:img]; } return self; }
其中調用父類的時候兩個參數都設置爲了nil,這樣的話,程序會在程序包裏面尋找名字與類相同的xib文件進行載入。也能夠指定文件的名字和程序包:ui
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { NSBundle *appBundle = [NSBundle mainBundle] ; self = [super initWithNibName:@"TimeViewController" bundle:appBundle]; if(self != nil) { UITabBarItem *tbi = [self tabBarItem]; [tbi setTitle:@"Hypnosis"]; UIImage *img = [UIImage imageNamed:@"Hypno.png"] ; [tbi setImage:img]; } return self; }
二,UITabBarController:spa
咱們看到的應用不少都是用到了底部的一個導航條,而UITabBarController就能夠很好的實現這個功能。只要爲UITabBarController設置一組UIViewController,它就會自動生成一個導航條。建立一個導航條:code
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customization after application launch. //creat controllers and group HypnosisViewController *hvc =[[HypnosisViewController alloc] init]; [[self window] setRootViewController:hvc]; TimeViewController *tvc = [[TimeViewController alloc] init]; [[self window] setRootViewController:tvc]; NSArray *viewControllers = [[NSArray alloc] initWithObjects:hvc,tvc,nil]; UITabBarController *tabBarController = [[UITabBarController alloc] init]; [tabBarController setViewControllers:viewControllers]; //set view root controller [[self window] setRootViewController:tabBarController]; self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; return YES; }
默認的導航條的每個tab都對應一個黑色的按鈕沒有任何東西,若想要定製每個tab選項的顯示,則能夠分別設置UIViewController當中的UITabBarItem屬性來作到:對象
UITabBarItem *tbi = [self tabBarItem]; [tbi setTitle:@"Time"]; UIImage *img = [UIImage imageNamed:@"Time.png"] ; [tbi setImage:img];
三,關於UIViewController的生命週期:blog
1,初始化UIViewController:經過alloc,init一類的方法來建立和初始化。繼承
對view的設置是必需的,可是咱們不能在init方法中寫任何由關於view的代碼。由於view在有可能在被釋放和從新載入,而init方法只有在初始化階段纔會執行,也就是說當view由於一些緣由(好比說內存不足警告)被釋放和從新載入之後寫在init裏面有關view的代碼是不會被執行的。因此初始化view的代碼應該在viewDidLoad方法裏面寫。
2,View在UIViewController中的載入有一種叫作延遲載入的機制,只有當view須要被放到屏幕上時controller纔會將其載入。
3,視圖的卸載:
視圖卸載在有一些狀況下不能依靠自動,由於有可能會形成內存泄露。若是視圖控制對象沒有指向子視圖的強引用,就不須要手動釋放(覆蓋viewDidUnload方法),不然須要手動對相關視圖進行釋放。
爲了不由引用帶來的內存泄露問題,一般都會將插頭變量(IBOutlet)聲明瞭弱引用。可是有一個例外:凡是針對xib文件中的頂層視圖的對象的引用,必須使用強引用。
學習筆記,僅供參考