詳解iOS的UI開發(fā)中控制器的創(chuàng)建方法
控制器的創(chuàng)建
說明:控制器有三種創(chuàng)建方式,下面一一進行說明。
一、第一種創(chuàng)建方式(使用代碼直接創(chuàng)建)
1.創(chuàng)建一個空的IOS項目。
2.為項目添加一個控制器類。

3.直接在代理方法中創(chuàng)建一個控制器。
#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];
//創(chuàng)建控制器
YYViewController *controller=[[YYViewController alloc]init];
//設置控制器View的背景顏色
controller.view.backgroundColor=[UIColor brownColor];
//設置該控制器為Window的根控制器
self.window.rootViewController=controller;
[self.window makeKeyAndVisible];
return YES;
}
4.控制器的view添加到Window上顯示出來。

二、第二種創(chuàng)建方式(通過storyboard創(chuàng)建)
1.添加一個storyboard文件,命名為test,在界面上拖一個view controller控制器。
2.設置這個控制器和程序中的YYviewController類進行關聯(lián),設置控制器view的顏色以便區(qū)分。

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,所以沒有能夠創(chuàng)建出我們想要的控制器。怎么辦?明確的告訴要加載的storyboard。
4.創(chuàng)建代碼:
#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,并不會創(chuàng)建storyboard中的控制器和控件)
UIStoryboard *storyboard=[UIStoryboard storyboardWithName:@"test" bundle:nil];
//2.下面這個方法代表著創(chuàng)建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)創(chuàng)建控制器
(3)把控制器設置為Window的根控制器
5.拓展
新的需求:如果在一個storyboard中又多個控制器,如何指定創(chuàng)建哪個特定的控制器呢?
這里有兩種方法可以考慮:
(1)更改初始控制器,即把箭頭拖拽到想要創(chuàng)建的控制器前面,在代碼中進行創(chuàng)建。

實現(xiàn)代碼:
#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.創(chuàng)建指定的控制器
UIViewController *controller=[storyboard instantiateInitialViewController];
//3.設置控制器為Window的根控制器
self.window.rootViewController=controller;
[self.window makeKeyAndVisible];
return YES;
}
提示:注意創(chuàng)建的指定控制器的類型。
(2)通過設置唯一的標識符來創(chuàng)建指定的控制器

實現(xiàn)代碼:
#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.創(chuàng)建指定的控制器
UIViewController *controller=[storyboard instantiateViewControllerWithIdentifier:@"one"];
//3.設置控制器為Window的根控制器
self.window.rootViewController=controller;
[self.window makeKeyAndVisible];
return YES;
}
三、第三種創(chuàng)建方式(使用xib)
1.新建一個xib文件,命名為two.xib。
2.創(chuàng)建過程和注意點
(1)創(chuàng)建代碼:
#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創(chuàng)建控制器
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")
產(chǎn)生原因:在xib文件中沒有進行任何操作。
解決方法:往xib中拖一個view
2)加載了xib,但是沒有設置輸出口(loaded the "two" nib but the view outlet was not set.')
產(chǎn)生原因:沒有把xib的view設置為YYviewController的view
解決方法:設置File‘s Owner,可以理解為設置這個文件歸誰所有,對File‘s Owner和view進行連線。連線是因為一個xib中可能會有多個view,在storyboard中默認就已經(jīng)進行了連線。

四、模仿有storyboard的項目控制器的創(chuàng)建
1.創(chuàng)建一個項目
2.在配置文件中,把主storyboard的名稱刪掉(找不到storyboard)。
3.代碼(storyboard做的事情就是下面的代碼所做的事情)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
// 1.創(chuàng)建winodw
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
// 2.創(chuàng)建控制器
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的創(chuàng)建
一、6種創(chuàng)建控制器View的方式
#import "NJAppDelegate.h"
#import "NJViewController.h"
/*
1.沒有同名xib情況下
2.通過 storyboard 創(chuàng)建
3.有指定xib情況下創(chuàng)建
4.有同名xib情況
5.有同名去掉controll的情況
6.loadveiw
*/
@implementation NJAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// 創(chuàng)建UIWindow
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
/*
// 1.第一種方式:沒有xib和storyboard
// (如果沒有xib和storyboard, 會自動創(chuàng)建一個空白的view做為控制器的veiw)
NJViewController *vc = [[NJViewController alloc] init];
*/
/*
//2.通過 storyboard 創(chuàng)建
// 如果通過storyboard創(chuàng)建, 會創(chuàng)建箭頭指向view做為控制器的veiw
// 如果重寫了控制器的loadview方法, 就不會創(chuàng)建storyboard中描述的view作為控制器的view, 而是創(chuàng)建一個空白的veiw做為控制器的veiw
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Test" bundle:nil];
NJViewController *vc = [storyboard instantiateInitialViewController];
*/
/*
// 3.有指定xib情況下創(chuàng)建
// 如果通過xib, 會創(chuàng)建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方法, 就不會去加載創(chuàng)建同名去掉controller的xib和同名的xib, 而是創(chuàng)建一個空白的veiw做為控制器的veiw
NJViewController *vc = [[NJViewController alloc] init];
// 設置控制器為window的根控制器
self.window.rootViewController = vc;
// 顯示window
[self.window makeKeyAndVisible];
return YES;
}
六種方式:
1.沒有同名xib情況下
2.通過 storyboard 創(chuàng)建
3.有指定xib情況下創(chuàng)建
4.有同名xib情況
5.有同名去掉controll的情況
6.loadveiw
二、創(chuàng)建控制器View的優(yōu)先級

蘋果官方文檔示意圖:

三、控制器View的延遲加載
說明:
控制器的view是延遲加載的:用到時再加載
可以用isViewLoaded方法判斷一個UIViewController的view是否已經(jīng)被加載
控制器的view加載完畢就會調用viewDidLoad方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// 1.創(chuàng)建UIWindow
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
// 2.創(chuàng)建控制器
NJViewController *vc = [[NJViewController alloc] init];
// 其實是兩步操作, 首先調用loadview方法, 創(chuàng)建控制器的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方法中創(chuàng)建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
相關文章
IOS UI學習教程之使用代碼創(chuàng)建button
這篇文章主要為大家詳細介紹了IOS UI學習教程之使用代碼創(chuàng)建button,感興趣的小伙伴們可以參考一下2016-03-03
IOS開發(fā)筆記整理49之詳解定位CLLocation
在項目功能中有一個定位CLLocation的需求,遇到了一些知識難點,經(jīng)過各位大俠的幫助,問題解決,特此分享供大家學習,希望大家共同學習進步2015-11-11
Flutter?ScrollController滾動監(jiān)聽及控制示例詳解
這篇文章主要為大家介紹了Flutter?ScrollController滾動監(jiān)聽及控制示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11
iOS開發(fā)中以application/json上傳文件實例詳解
在和sever后臺交互的過程中、有時候、他們需要我們iOS開發(fā)者以“application/json”形式上傳,具體實例代碼大家參考下本文2017-07-07

