控制器的創建
說明:控制器有三種創建方式,下面一一進行說明。
一、第一種創建方式(使用代碼直接創建)
1.創建一個空的IOS項目。
2.為項目添加一個控制器類。
3.直接在代理方法中創建一個控制器。
代碼如下:
#import "YYAppDelegate.h"
#import "YYViewController.h"
@implementation YYAppDelegate
- (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];
//創建控制器
YYViewController *controller=[[YYViewController alloc]init];
//設置控制器View的背景顏色
controller.view.backgroundColor=[UIColor brownColor];
//設置該控制器為Window的根控制器
self.window.rootViewController=controller;
[self.window makeKeyAndVisible];
return YES;
}
4.控制器的view添加到Window上顯示出來。
二、第二種創建方式(通過storyboard創建)
1.添加一個storyboard文件,命名為test,在界面上拖一個view controller控制器。
2.設置這個控制器和程序中的YYviewController類進行關聯,設置控制器view的顏色以便區分。
3.注意這種錯誤寫法。
代碼如下:
- (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];
YYViewController *controller=[[YYViewController alloc]init];
self.window.rootViewController=controller;
[self.window makeKeyAndVisible];
return YES;
}
注意:僅僅這樣是不行的,因為程序中並沒有加載storyboard,所以沒有能夠創建出我們想要的控制器。怎麼辦?明確的告訴要加載的storyboard。
4.創建代碼:
代碼如下:
#import "YYAppDelegate.h"
#import "YYViewController.h"
@implementation YYAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
// YYViewController *controller=[[YYViewController alloc]init];
//1.加載storyboard,(注意:這裡僅僅是加載名稱為test的storyboard,並不會創建storyboard中的控制器和控件)
UIStoryboard *storyboard=[UIStoryboard storyboardWithName:@"test" bundle:nil];
//2.下面這個方法代表著創建storyboard中箭頭指向的控制器(初始控制器)
YYViewController *controller=[storyboard instantiateInitialViewController];
//參考
// UINib *nib=[UINib nibWithNibName:@"test" bundle:nil];
// [nib instantiateWithOwner:nil options:nil];
//3.設置控制器為Window的根控制器
self.window.rootViewController=controller;
[self.window makeKeyAndVisible];
return YES;
}
步驟:
(1)加載storyboard
(2)創建控制器
(3)把控制器設置為Window的根控制器
5.拓展
新的需求:如果在一個storyboard中又多個控制器,如何指定創建哪個特定的控制器呢?
這裡有兩種方法可以考慮:
(1)更改初始控制器,即把箭頭拖拽到想要創建的控制器前面,在代碼中進行創建。
實現代碼:
代碼如下:
#import "YYAppDelegate.h"
#import "YYViewController.h"
@implementation YYAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
// YYViewController *controller=[[YYViewController alloc]init];
//1.加載storyboard
UIStoryboard *storyboard=[UIStoryboard storyboardWithName:@"test" bundle:nil];
//2.創建指定的控制器
UIViewController *controller=[storyboard instantiateInitialViewController];
//3.設置控制器為Window的根控制器
self.window.rootViewController=controller;
[self.window makeKeyAndVisible];
return YES;
}
提示:注意創建的指定控制器的類型。
(2)通過設置唯一的標識符來創建指定的控制器
實現代碼:
代碼如下:
#import "YYAppDelegate.h"
#import "YYViewController.h"
@implementation YYAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
//1.加載storyboard
UIStoryboard *storyboard=[UIStoryboard storyboardWithName:@"test" bundle:nil];
//2.創建指定的控制器
UIViewController *controller=[storyboard instantiateViewControllerWithIdentifier:@"one"];
//3.設置控制器為Window的根控制器
self.window.rootViewController=controller;
[self.window makeKeyAndVisible];
return YES;
}
三、第三種創建方式(使用xib)
1.新建一個xib文件,命名為two.xib。
2.創建過程和注意點
(1)創建代碼:
代碼如下:
#import "YYAppDelegate.h"
#import "YYViewController.h"
@implementation YYAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
//1.通過xib創建控制器
YYViewController *controller=[[YYViewController alloc]initWithNibName:@"two" bundle:nil];
//2.設置這個控制器為Window的根控制器
self.window.rootViewController=controller;
[self.window makeKeyAndVisible];
return YES;
}
(2)兩個錯誤注意點
1)不能加載(was unable to load a nib named "two")
產生原因:在xib文件中沒有進行任何操作。
解決方法:往xib中拖一個view
2)加載了xib,但是沒有設置輸出口(loaded the "two" nib but the view outlet was not set.')
產生原因:沒有把xib的view設置為YYviewController的view
解決方法:設置File‘s Owner,可以理解為設置這個文件歸誰所有,對File‘s Owner和view進行連線。連線是因為一個xib中可能會有多個view,在storyboard中默認就已經進行了連線。
四、模仿有storyboard的項目控制器的創建
1.創建一個項目
2.在配置文件中,把主storyboard的名稱刪掉(找不到storyboard)。
3.代碼(storyboard做的事情就是下面的代碼所做的事情)
代碼如下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
// 1.創建winodw
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
// 2.創建控制器
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
NJViewController * vc = [storyboard instantiateInitialViewController];
// 3.設置window的根控制器
self.window.rootViewController = vc;
// 4.顯示window
[self.window makeKeyAndVisible];
return YES;
}
控制器的View的創建
一、6種創建控制器View的方式
代碼如下:
#import "NJAppDelegate.h"
#import "NJViewController.h"
/*
1.沒有同名xib情況下
2.通過 storyboard 創建
3.有指定xib情況下創建
4.有同名xib情況
5.有同名去掉controll的情況
6.loadveiw
*/
@implementation NJAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// 創建UIWindow
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
/*
// 1.第一種方式:沒有xib和storyboard
// (如果沒有xib和storyboard, 會自動創建一個空白的view做為控制器的veiw)
NJViewController *vc = [[NJViewController alloc] init];
*/
/*
//2.通過 storyboard 創建
// 如果通過storyboard創建, 會創建箭頭指向view做為控制器的veiw
// 如果重寫了控制器的loadview方法, 就不會創建storyboard中描述的view作為控制器的view, 而是創建一個空白的veiw做為控制器的veiw
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Test" bundle:nil];
NJViewController *vc = [storyboard instantiateInitialViewController];
*/
/*
// 3.有指定xib情況下創建
// 如果通過xib, 會創建xib中描述的veiw做為控制器的veiw
NJViewController *vc = [[NJViewController alloc] initWithNibName:@"One" bundle:nil];
*/
/*
// 4.有同名xib情況
// 如果有同名的xib, 會自動找到同名xib中描述的view做為控制器的veiw
NJViewController *vc = [[NJViewController alloc] init];
*/
/*
// 5.有同名去掉Controller的 xib情況
// 如果有有同名去掉Controller的xib, 會自動找到該xib的view做為控制器的view
NJViewController *vc = [[NJViewController alloc] init];
*/
// 6.重寫控制器的loadveiw方法
// 如果重寫了控制器的loadview方法, 就不會去加載創建同名去掉controller的xib和同名的xib, 而是創建一個空白的veiw做為控制器的veiw
NJViewController *vc = [[NJViewController alloc] init];
// 設置控制器為window的根控制器
self.window.rootViewController = vc;
// 顯示window
[self.window makeKeyAndVisible];
return YES;
}
六種方式:
1.沒有同名xib情況下
2.通過 storyboard 創建
3.有指定xib情況下創建
4.有同名xib情況
5.有同名去掉controll的情況
6.loadveiw
二、創建控制器View的優先級
蘋果官方文檔示意圖:
三、控制器View的延遲加載
說明:
控制器的view是延遲加載的:用到時再加載
可以用isViewLoaded方法判斷一個UIViewController的view是否已經被加載
控制器的view加載完畢就會調用viewDidLoad方法
代碼如下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// 1.創建UIWindow
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
// 2.創建控制器
NJViewController *vc = [[NJViewController alloc] init];
// 其實是兩步操作, 首先調用loadview方法, 創建控制器的veiw,然後再設置控制器的view的顏色為紫色, 也就是說後一次的顏色覆蓋掉了前一次的顏色
vc.view.backgroundColor = [UIColor purpleColor];
// 3.設置控制器為window的根控制器
self.window.rootViewController = vc;
// 4.顯示window(在這一行才用到了控制器的veiw)
[self.window makeKeyAndVisible];
return YES;
}
主控制器文件中:
代碼如下:
#import "NJViewController.h"
@interface NJViewController ()
@end
@implementation NJViewController
// 當控制器需要顯示控制器的view的時候就會調用loadView
// 可以在loadView方法中創建view給控制器
// 該方法一般用於自定義控制器的view
- (void)loadView
{
// 什麼時候調用loadveiw就代表什麼時候加載控制器的veiw
NSLog(@"loadView");
self.view = [[UIView alloc] init];
self.view.backgroundColor = [UIColor greenColor];
}
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"viewDidLoad");
}
@end