1. 程式人生 > >iOS-UIViewController建立的幾種方法和UIWindow的介紹

iOS-UIViewController建立的幾種方法和UIWindow的介紹

在程式的啟動過程中提到如果沒有storyboard時:      * 程式啟動時候, 就會呼叫代理的application:  didFinishLaunchingWithOptions:方法      * 在application: didFinishLaunchingWithOptions:中建立UIWindow      * 建立和設定UIWindow的rootViewController      * 顯示視窗 也就是說:程式啟動,先載入UIWindow,UIWindow將作為容器去接收的控制元件; 那麼UIWindow是什麼?      UIwindow是一個特殊的UIView,在一個app
只能有一個UIWindowkeyWindow iOS程式啟動完畢後,建立的第一個檢視控制元件就是UIWindow,接著建立UIViewController的view最後將UIViewController的view新增到UIWindow上,於是UIViewController的view就顯示在螢幕上了;      一個iOS程式之所以能顯示到螢幕上,完全是因為它有UIWindow。           ps:UIViewController的屬性         @property(null_resettable,nonatomic,strong)UIView*view; 看一張圖片:
 UIwindow的常見方法:      - (void)makeKeyWindow;           讓當前UIWindow變成keyWindow(主視窗)      - (void)makeKeyAndVisible;           讓當前UIWindow變成keyWindow,並顯示出來           新增UIViewUIWindow      - (void)addSubview:(UIView*)view;           直接將view新增到UIWindow中,但並不會理會view對應的UIViewController      @property
(nonatomic,retain)UIViewController*rootViewController;           自動將rootViewControllerview新增到UIWindow,負責管理rootViewController的生命週期     總結:在沒有storyboard時,首先需要建立UIWindow,再建立UIViewController; UIViewController的建立方式一:程式碼建立 建立一個類YSCViewController繼承自ViewController,將標頭檔案(#import“YSCViewController.h”)匯入 AppDelegate.m 程式碼:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    //例項化window
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];

    //建立控制器並使之成為root控制器
    YSCViewController *vc = [[YSCViewController alloc] init];
    self.window.rootViewController = vc;

    //設定window為主window和可見
    [self.window makeKeyAndVisible];
    return YES;
}

UIViewController的建立方式二:Xib方式
1.指定xib的名稱:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    //例項化window
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];

    //建立控制器並使之成為root控制器
    YSCViewController *vc = [[YSCViewController alloc] initWithNibName:@"YSCViewController" bundle:nil];
    self.window.rootViewController = vc;

    //設定window為主window和可見
    [self.window makeKeyAndVisible];
    return YES;
}

2.不指定xib的名稱時:在Xcode7.1中,預設優先與UIViewController類同名的Xib(即YSCViewController),如果同名的不存在,再去呼叫去掉Controller的Xib(即YSCView);
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    //例項化window
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];

    //建立控制器並使之成為root控制器
    YSCViewController *vc = [[YSCViewController alloc] init];
    self.window.rootViewController = vc;

    //設定window為主window和可見
    [self.window makeKeyAndVisible];
    return YES;
}

用xib建立時的注意點:(如果建立類時,同時建立Xib則無需關注)

 把該view連線設為主檔案
UIViewController的建立方式三:storyboard方式
建立YSCStoryboard.storyboard,並建立兩個UIViewController,並將在storyboard 裡面Class 要指向要對應的UIViewController,我使用工程中已經存在的類預設的ViewController
1.通過初始化“初始控制器”(storyboard中箭頭所指的控制器)來匯入
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    //例項化window
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];

    //匯入載入storyboard並使之成為root控制器
    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"YSCStoryboard" bundle:nil];
    ViewController *vc = sb.instantiateInitialViewController;
    self.window.rootViewController = vc;

    //設定window為主window和可見
    [self.window makeKeyAndVisible];
    return YES;
}

2.通過一個標識初始化對應的控制器來匯入

    //匯入載入storyboard並使之成為root控制器
    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"YSCStoryboard" bundle:nil];
    ViewController *vc = [sb instantiateViewControllerWithIdentifier:@"edit"];
    self.window.rootViewController = vc;