標籤:
UIScreen是與裝置有關的物理螢幕
Window是一個視窗對應UIWindow類,繼承自UIView,window要顯示在Screen上必須設定為主視窗並且可見。接下來就可以往UIWindow上面添加一些控制項了。
就是簡單地層次關係
ViewController是用來組織和控制視圖的,與不同的是這裡使用了視圖控制器ViewController,不需要直接將view指定給window,相反,只需要給window制定一個視圖控制器,視圖控制器會自動的將他的view添加給window。如所示:
引入控制器有點像Android裡面的Activity。
UIWindow *window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];levelViewController = [[LevelViewController alloc] init];window.rootViewController = levelViewController;// 類似於下面這句//[window addSubView: levelViewController.view];[window makeKeyAndVisible];
建立控制器的三種方式1.通過storyboardd
iOS會自動的執行下面的操作
執行個體化一個window
載入主storyboard並且執行個體化初始ViewController
指定視圖控制器為window的根控制器rootViewController,接下來使得window顯示在螢幕上
使用代碼描述大概:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; QHViewController * vc = [storyboard instantiateInitialViewController]; self.window.rootViewController = vc; [self.window makeKeyAndVisible]; return YES;}
注意:以上三個步驟是iOS主動做的,因此建立singleView的項目會看不到application:didFinishLaunchingWithOptions:方法裡面有任何內容。
要想自己使用storyboard裡面的其他控制器需要通過UIStoryBoard對象來實現
a. 通過UIStoryboard類的storyboardWithName方法得到UIStoryBoard對象
b. 通過instantiateInitialViewController或者instantiateViewControllerWithIdentifier:方法得到對應的控制器
代碼大致如下:
UIStoryboard *storyboard = self.storyboard; SpecialViewController *svc = [storyboard instantiateViewControllerWithIdentifier:@"SpecialViewController"]; // Configure the new view controller here. [self presentViewController:svc animated:YES completion:nil];
2.使用xib
Xib是storyboard的前身,使用storyboard的好處是可以建立起介面跳轉的關係,看起來更加直觀。
建立一個繼承自UIViewController的類。建立一個xib檔案,將其File’s owner指定為自訂的控制器,並且一定要將view屬性連線到要顯示的那個View裡面(因為一個xib檔案裡面可能有多個UIView)
QHViewController *controller=[[ QHViewController alloc]initWithNibName:@"test" bundle:nil];
其實上面這句若寫成了
QHViewController *controller=[[ QHViewController alloc]init];
也可以載入xib,只不過載入不了名字為text.xib的檔案,後面會講到。
可能的錯誤:
a. was unable to load a nib named XXX:說明xib裡面沒有任何view
b. loaded the XXX nib but the view outlet was not set :將其File’sowner指定為自訂的控制器,並且一定要將view屬性連線到要顯示的那個View裡面
3.使用純程式碼
- (void)applicationDidFinishLaunching:(UIApplication *)application { UIWindow *window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; levelViewController = [[LevelViewController alloc] init]; window.rootViewController = levelViewController; [window makeKeyAndVisible];}
上面這句levelViewController = [[LevelViewController alloc] init];在建立自己的控制器的時候其實會做以下的處理:
a.預設會尋找與控制器匹配的.xib檔案,匹配的意思是如果該控制器類為QHFirstViewController,那麼匹配的.xib檔案為QHFirstView.xib
b.如果未找到,會尋找和控制器同名的.xib檔案
c.以上均未找到,就會建立一個空白的View將其賦值給控制器的view屬性。
self.view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
控制器中View的建立方式
上面的c步驟可以通過在viewDidLoad方法裡面列印self.view是有值的看出來,建立該view是在loadView方法裡面做的。當view需要被展示而它卻是nil時,viewController會調用該方法。可以重寫一下loadView方法,發現程式停在那裡無法執行,原因就是父類會做載入view的操作,調用[super loadView]就可以。使用純程式碼寫布局的話就不需要調用[super loadView]了,因為該方法的父類中實現的無外乎是通過storyboard或者xib載入view,既然要使用代碼自訂也就沒必要從其他地方載入了。
事實上,通過storyboard,xib也是在loadView方法裡面載入的。loadView方法做的事情如所示
官方給的圖相當的好,展示出了loadView方法所做的事,只是通過xib載入view沒有展現在上面,並且官方的文檔沒有xib相關的內容取而代之的是storyboard,這與蘋果推崇storyboard是一致的。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
iOS學習4_控制器的建立方式和控制器view的建立