iOS學習4_控制器的建立方式和控制器view的建立

來源:互聯網
上載者:User

標籤:

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的建立

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.