iOS-UIViewController建立的幾種方法和UIWindow的介紹
阿新 • • 發佈:2019-01-05
在程式的啟動過程中提到如果沒有storyboard時:
* 程式啟動時候, 就會呼叫代理的application: didFinishLaunchingWithOptions:方法
* 在application: didFinishLaunchingWithOptions:中建立UIWindow
* 建立和設定UIWindow的rootViewController
* 顯示視窗
也就是說:程式啟動,先載入UIWindow,UIWindow將作為容器去接收的控制元件;
那麼UIWindow是什麼?
UIwindow是一個特殊的UIView,在一個app 只能有一個UIWindow是keyWindow;
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,並顯示出來
新增UIView到UIWindow中
- (void)addSubview:(UIView*)view;
直接將view新增到UIWindow中,但並不會理會view對應的UIViewController
@property (nonatomic,retain)UIViewController*rootViewController;
自動將rootViewController的view新增到UIWindow中,負責管理rootViewController的生命週期
總結:在沒有storyboard時,首先需要建立UIWindow,再建立UIViewController;
UIViewController的建立方式一:程式碼建立
建立一個類YSCViewController繼承自ViewController,將標頭檔案(#import“YSCViewController.h”)匯入
AppDelegate.m
程式碼:
UIViewController的建立方式二:Xib方式
1.指定xib的名稱:
2.不指定xib的名稱時:在Xcode7.1中,預設優先與UIViewController類同名的Xib(即YSCViewController),如果同名的不存在,再去呼叫去掉Controller的Xib(即YSCView);
用xib建立時的注意點:(如果建立類時,同時建立Xib則無需關注)
把該view連線設為主檔案
UIViewController的建立方式三:storyboard方式
建立YSCStoryboard.storyboard,並建立兩個UIViewController,並將在storyboard 裡面Class 要指向要對應的UIViewController,我使用工程中已經存在的類預設的ViewController
1.通過初始化“初始控制器”(storyboard中箭頭所指的控制器)來匯入
2.通過一個標識初始化對應的控制器來匯入
- (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;