在UI開發中我們需要用到控制器,那么我們就需要自己創建一個控制器,你知道如何創建iOS中的UI開發中控制器嗎?想了解的朋友們一起跟隨武林小編去看看吧。
控制器的創建
說明:控制器有三種創建方式,下面一一進行說明。
一、第一種創建方式(使用代碼直接創建)
1.創建一個空的IOS項目。
2.為項目添加一個控制器類。

3.直接在代理方法中創建一個控制器。
?
?
@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.注意這種錯誤寫法。
?
?
?
注意:僅僅這樣是不行的,因為程序中并沒有加載storyboard,所以沒有能夠創建出我們想要的控制器。怎么辦?明確的告訴要加載的storyboard。
?
4.創建代碼:
?
?
@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)更改初始控制器,即把箭頭拖拽到想要創建的控制器前面,在代碼中進行創建。

實現代碼:
?
?
@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)通過設置唯一的標識符來創建指定的控制器

實現代碼:
?
?
@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)創建代碼:
?
?
@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做的事情就是下面的代碼所做的事情)
?
?
?
?
?
?
控制器的View的創建
一、6種創建控制器View的方式
?
?
- (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方法
?
?
?
主控制器文件中:
?
?
?
@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
?
以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持武林技術頻道!
?
?
新聞熱點
疑難解答