詳解iOS的UI開發(fā)中控制器的創(chuàng)建方法
控制器的創(chuàng)建
說明:控制器有三種創(chuàng)建方式,下面一一進(jìn)行說明。
一、第一種創(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];
//設(shè)置控制器View的背景顏色
controller.view.backgroundColor=[UIColor brownColor];
//設(shè)置該控制器為Window的根控制器
self.window.rootViewController=controller;
[self.window makeKeyAndVisible];
return YES;
}
4.控制器的view添加到Window上顯示出來。
二、第二種創(chuàng)建方式(通過storyboard創(chuàng)建)
1.添加一個storyboard文件,命名為test,在界面上拖一個view controller控制器。
2.設(shè)置這個控制器和程序中的YYviewController類進(jìn)行關(guān)聯(lián),設(shè)置控制器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.設(shè)置控制器為Window的根控制器
self.window.rootViewController=controller;
[self.window makeKeyAndVisible];
return YES;
}
步驟:
(1)加載storyboard
(2)創(chuàng)建控制器
(3)把控制器設(shè)置為Window的根控制器
5.拓展
新的需求:如果在一個storyboard中又多個控制器,如何指定創(chuàng)建哪個特定的控制器呢?
這里有兩種方法可以考慮:
(1)更改初始控制器,即把箭頭拖拽到想要創(chuàng)建的控制器前面,在代碼中進(jìn)行創(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.設(shè)置控制器為Window的根控制器
self.window.rootViewController=controller;
[self.window makeKeyAndVisible];
return YES;
}
提示:注意創(chuàng)建的指定控制器的類型。
(2)通過設(shè)置唯一的標(biāo)識符來創(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.設(shè)置控制器為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.設(shè)置這個控制器為Window的根控制器
self.window.rootViewController=controller;
[self.window makeKeyAndVisible];
return YES;
}
(2)兩個錯誤注意點
1)不能加載(was unable to load a nib named "two")
產(chǎn)生原因:在xib文件中沒有進(jìn)行任何操作。
解決方法:往xib中拖一個view
2)加載了xib,但是沒有設(shè)置輸出口(loaded the "two" nib but the view outlet was not set.')
產(chǎn)生原因:沒有把xib的view設(shè)置為YYviewController的view
解決方法:設(shè)置File‘s Owner,可以理解為設(shè)置這個文件歸誰所有,對File‘s Owner和view進(jìn)行連線。連線是因為一個xib中可能會有多個view,在storyboard中默認(rèn)就已經(jīng)進(jìn)行了連線。
四、模仿有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.設(shè)置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];
// 設(shè)置控制器為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加載完畢就會調(diào)用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];
// 其實是兩步操作, 首先調(diào)用loadview方法, 創(chuàng)建控制器的veiw,然后再設(shè)置控制器的view的顏色為紫色, 也就是說后一次的顏色覆蓋掉了前一次的顏色
vc.view.backgroundColor = [UIColor purpleColor];
// 3.設(shè)置控制器為window的根控制器
self.window.rootViewController = vc;
// 4.顯示window(在這一行才用到了控制器的veiw)
[self.window makeKeyAndVisible];
return YES;
}
主控制器文件中:
#import "NJViewController.h"
@interface NJViewController ()
@end
@implementation NJViewController
// 當(dāng)控制器需要顯示控制器的view的時候就會調(diào)用loadView
// 可以在loadView方法中創(chuàng)建view給控制器
// 該方法一般用于自定義控制器的view
- (void)loadView
{
// 什么時候調(diào)用loadveiw就代表什么時候加載控制器的veiw
NSLog(@"loadView");
self.view = [[UIView alloc] init];
self.view.backgroundColor = [UIColor greenColor];
}
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"viewDidLoad");
}
@end
相關(guān)文章
IOS 開發(fā)之UITableView 刪除表格單元寫法
這篇文章主要介紹了IOS 開發(fā)之UITableView 刪除表格單元寫法的相關(guān)資料,這里提供實例幫助大家實現(xiàn)該功能,希望能幫助到大家,需要的朋友可以參考下2017-08-08iOS系統(tǒng)和微信中不支持audio自動播放問題的解決方法
最近在微信端開發(fā)H5的時候,audio標(biāo)簽在蘋果機(jī)上無法進(jìn)行自動播放,查找相關(guān)資料終于解決了,所以下面這篇文章主要給大家介紹了關(guān)于iOS系統(tǒng)和微信中不支持audio自動播放問題的解決方法,需要的朋友可以參考下。2017-09-09iOS 11更新后及iPhone X推出后工程中遇到的問題及適配方法
這篇文章主要介紹了iOS 11更新后及iPhone X推出后工程中遇到的問題及適配,需要的朋友可以參考下2017-10-10iOS應(yīng)用UI開發(fā)中的字體和按鈕控件使用指南
這篇文章主要介紹了iOS應(yīng)用UI開發(fā)中的字體和按鈕控件使用指南,分別簡單講解了UILabel和UIButton的用法,需要的朋友可以參考下2016-01-01