你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 詳解iOS的UI開發中控制器的創建方法

詳解iOS的UI開發中控制器的創建方法

編輯:IOS開發綜合

控制器的創建
說明:控制器有三種創建方式,下面一一進行說明。

一、第一種創建方式(使用代碼直接創建)

1.創建一個空的IOS項目。

2.為項目添加一個控制器類。

20151126121621654.png (536×159)

3.直接在代理方法中創建一個控制器。

復制代碼 代碼如下:
#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];
   
    //創建控制器
    YYViewController *controller=[[YYViewController alloc]init];
    //設置控制器View的背景顏色
    controller.view.backgroundColor=[UIColor brownColor];
    //設置該控制器為Window的根控制器
    self.window.rootViewController=controller;
    [self.window makeKeyAndVisible];
    return YES;
}


4.控制器的view添加到Window上顯示出來。

20151126122000297.png (319×502)

二、第二種創建方式(通過storyboard創建)

1.添加一個storyboard文件,命名為test,在界面上拖一個view controller控制器。

2.設置這個控制器和程序中的YYviewController類進行關聯,設置控制器view的顏色以便區分。

20151126122020068.png (800×323)

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,所以沒有能夠創建出我們想要的控制器。怎麼辦?明確的告訴要加載的storyboard。

4.創建代碼:

復制代碼 代碼如下:
#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,並不會創建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)更改初始控制器,即把箭頭拖拽到想要創建的控制器前面,在代碼中進行創建。

20151126122046257.png (782×296)

實現代碼:

復制代碼 代碼如下:
#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.創建指定的控制器
    UIViewController *controller=[storyboard instantiateInitialViewController];
   
    //3.設置控制器為Window的根控制器
    self.window.rootViewController=controller;
   
    [self.window makeKeyAndVisible];
    return YES;
}


提示:注意創建的指定控制器的類型。

(2)通過設置唯一的標識符來創建指定的控制器

20151126122106223.png (840×287)

實現代碼:

復制代碼 代碼如下:
#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.創建指定的控制器
   
    UIViewController *controller=[storyboard instantiateViewControllerWithIdentifier:@"one"];
    //3.設置控制器為Window的根控制器
    self.window.rootViewController=controller;
   
    [self.window makeKeyAndVisible];
    return YES;
}


三、第三種創建方式(使用xib)

1.新建一個xib文件,命名為two.xib。

2.創建過程和注意點

(1)創建代碼:

復制代碼 代碼如下:
#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創建控制器
    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中默認就已經進行了連線。

20151126122219443.png (895×168)

四、模仿有storyboard的項目控制器的創建

1.創建一個項目

2.在配置文件中,把主storyboard的名稱刪掉(找不到storyboard)。

3.代碼(storyboard做的事情就是下面的代碼所做的事情)

復制代碼 代碼如下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  
    // Override point for customization after application launch.
    // 1.創建winodw
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    // 2.創建控制器
    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的創建
一、6種創建控制器View的方式

復制代碼 代碼如下:
#import "NJAppDelegate.h"
#import "NJViewController.h"
/*
 1.沒有同名xib情況下
 2.通過 storyboard 創建
 3.有指定xib情況下創建
 4.有同名xib情況
 5.有同名去掉controll的情況
 6.loadveiw
 */
@implementation NJAppDelegate

- (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的優先級

20151126122242127.png (719×380)

蘋果官方文檔示意圖:

20151126122258265.png (1421×1210)

三、控制器View的延遲加載

說明:

控制器的view是延遲加載的:用到時再加載

可以用isViewLoaded方法判斷一個UIViewController的view是否已經被加載

控制器的view加載完畢就會調用viewDidLoad方法

復制代碼 代碼如下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // 1.創建UIWindow
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor whiteColor];
   
   
    // 2.創建控制器
     NJViewController *vc = [[NJViewController alloc] init];
   
    // 其實是兩步操作, 首先調用loadview方法, 創建控制器的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方法中創建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


  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved