iOS —— 程序啟動流程和自定義程序窗口

在上文 iOS —— 視圖,視圖控制器和窗口 中,我們大概描述視圖,視圖控制器和窗口這是三個開發中繞不開的東西。

接下來我們再來看一下程序的啟動流程,然后修改一下啟動流程的一些步驟,自定義啟動窗口。

一、iOS 程序簡易啟動流程

一.1、找到main.m文件,執行 main 函數 里面的 UIApplicationMain 方法,創建UIApplication對象,并設置UIApplication的代理.

main.m.png

#import <UIKit/UIKit.h>
#import "AppDelegate.h"

/**
 第三個參數:UIApplication或子類對象 ,為nil則默認為自帶的 UIApplication
 第四個參數:第三個參數的類的名稱
 */
int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

一.2、UIApplicationMain會開啟了一個事件循環.(主運行循環,死循環:保證應用程序不退出)

Discussion
This function instantiates the application object from the principal class and instantiates the 
delegate (if any) from the given class and sets the delegate for the application. 
It also sets up the main event loop, including the application’s run loop, 
and begins processing events. If the application’s Info.plist file specifies a main nib file to be loaded, 
by including the NSMainNibFile key and a valid nib file name for the value, this function loads that nib file.

一.4、加載info.plist文件,在Main storyboard file base name一欄檢查是否有指定 storyboard 文件的名稱

判斷info.plist當中有沒有storyboard (比如Main.storyboard)

  • 如果沒有,那么就把待會啟動程序就是一片黑色,黑色就是窗口的顏色、
  • 如果有,那么就把storyboard里面箭頭指向的控制器設置窗口的控制器(如果該控制器不是箭頭指向的控制器,那么運行加載出來的依然是一片黑,所以箭頭指向很重要)

一.5、應用程序啟動完畢.(通知代理應用程序啟動完畢)

二、自定義啟動窗口

先有盤古開天,后有天地。
在iOS程序的世界的世界里,先有UIWindows,再有頁面。

新建程序自帶的Main.storyboard是為了我們方便編碼測試,但是開發中為了讓我們對程序有更全面的控制,我們經常不用系統的Main.storyboard,而是用我們的UIWindow。

用自己的UIWindow,就是要把 AppDelegate.m的里面把系統幫我們也做出來,簡單分為如下三步:

1、創建窗口(窗口必須有指定的 根控制器 )
2、創建根控制器,窗口指向根控制器
3、顯示

簡單代碼


#import "AppDelegate.h"

@interface AppDelegate ()

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //1.創建窗口
    // self.window,在AppDelegate.h文件里面是自帶強引用,必須強引用
    self.window = [[UIWindow  alloc] initWithFrame:[UIScreen mainScreen].bounds];
    
    //2.一個窗口必須得有根控制器(設置窗口的根控制器)
    // ios9智慧窗口如果不設置大小,那么默認就是屏幕大小
    UIViewController *vc = [[UIViewController alloc] init];
    vc.view.backgroundColor = [UIColor redColor]; //設置控制器的背景為紅色
    self.window.rootViewController = vc;
    
    // 顯示
    [self.window makeKeyAndVisible];
    return YES;
}

@end

.
效果

Paste_Image.png

.
.

通過上面的圖文,我們知道第一第二步沒什么特別的,但是第三步的 makeKeyAndVisible 方法內部做了挺多事情的,比如如下這些:
makeKeyAndVisible 做了如下這么幾件事情:
1.設置應用程序的主窗口
2.讓窗口顯示,把窗口 hidden = NO (默認是YES),
顯示過程當中,把窗口的 根控制器的view 添加到窗口上 相當于 [self.window addsubView:rootViewCotroller.view]

我們再看一份代碼,把makeKeyAndVisible做的事情分幾次完成

#import "AppDelegate.h"

@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //1.創建窗口
    // self.window,在AppDelegate.h文件里面是自帶強引用,必須強引用
    self.window = [[UIWindow  alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.window.backgroundColor = [UIColor yellowColor];
    
    
    //2.一個窗口必須得有根控制器(設置窗口的根控制器)
    // ios9智慧窗口如果不設置大小,那么默認就是屏幕大小
    UIViewController *vc = [[UIViewController alloc] init];
    vc.view.backgroundColor = [UIColor redColor]; //設置控制器的背景為紅色
    // 往控制器上添加一個按鈕
    UIButton *button =[[UIButton alloc]initWithFrame:CGRectMake(10, 30, 50, 100)];
    button.backgroundColor = [UIColor greenColor];
    [vc.view addSubview:button];
    
    NSLog(@"keyWindow 主窗口  第一次  %@",[UIApplication sharedApplication].keyWindow);
    NSLog(@"subviews 窗口的子View 第一次  %@",self.window.subviews);
    NSLog(@"hidden狀態  第一次 %@\n",self.window);

    
    self.window.rootViewController = vc;
    NSLog(@"keyWindow 主窗口  第二次  %@",[UIApplication sharedApplication].keyWindow);
    NSLog(@"subviews 窗口的子View 第二次  %@",self.window.subviews);
    NSLog(@"hidden狀態  第二次 %@\n",self.window);
    
    [self.window makeKeyWindow];
    NSLog(@"keyWindow 主窗口  第四次  %@",[UIApplication sharedApplication].keyWindow);
    NSLog(@"subviews 窗口的子View 第四次  %@",self.window.subviews);
    NSLog(@"hidden狀態  第四次 %@\n",self.window);
    
    
    self.window.hidden = NO;
    NSLog(@"hidden 狀態 設置后  %@",self.window);
    NSLog(@"keyWindow 主窗口  第三次  %@",[UIApplication sharedApplication].keyWindow);
    NSLog(@"hidden狀態  第三次 %@\n",self.window);

    return YES;
}
@end

.
.
根據這份代碼生成的log

keyWindow 主窗口  第一次  (null)
subviews 窗口的子View 第一次  (
)
hidden狀態  第一次 <UIWindow: 0x7fefab7077d0; frame = (0 0; 375 667); hidden = YES; gestureRecognizers = <NSArray: 0x61800004d3b0>; layer = <UIWindowLayer: 0x618000220700>>

keyWindow 主窗口  第二次  (null)
subviews 窗口的子View 第二次  (
)
hidden狀態  第二次 <UIWindow: 0x7fefab7077d0; frame = (0 0; 375 667); hidden = YES; gestureRecognizers = <NSArray: 0x61800004d3b0>; layer = <UIWindowLayer: 0x618000220700>>

keyWindow 主窗口  第四次  <UIWindow: 0x7fefab7077d0; frame = (0 0; 375 667); hidden = YES; gestureRecognizers = <NSArray: 0x61800004d3b0>; layer = <UIWindowLayer: 0x618000220700>>
subviews 窗口的子View 第四次  (
)
hidden狀態  第四次 <UIWindow: 0x7fefab7077d0; frame = (0 0; 375 667); hidden = YES; gestureRecognizers = <NSArray: 0x61800004d3b0>; layer = <UIWindowLayer: 0x618000220700>>

hidden 狀態 設置后  <UIWindow: 0x7fefab7077d0; frame = (0 0; 375 667); gestureRecognizers = <NSArray: 0x61800004d3b0>; layer = <UIWindowLayer: 0x618000220700>>
keyWindow 主窗口  第三次  <UIWindow: 0x7fefab7077d0; frame = (0 0; 375 667); gestureRecognizers = <NSArray: 0x61800004d3b0>; layer = <UIWindowLayer: 0x618000220700>>
hidden狀態  第三次 <UIWindow: 0x7fefab7077d0; frame = (0 0; 375 667); gestureRecognizers = <NSArray: 0x61800004d3b0>; layer = <UIWindowLayer: 0x618000220700>>

嗯我想已經很全面了。

注意點:
1、如果hidden狀態為YES,那么窗口無法顯示,即使已經makeKeyWindow
2、如果設置了makeKeyWindow,那么就代表已經給 UIWindows 設置跟控制器了(當前前提是你前面已經[vc.view addSubview:button]),但是如果設置hidden為NO依然不行,但是確實已經設置上去了。

所以: makeKeyAndVisible = hidden + makeKeyWindow

.
.
.
本篇完。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,702評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,615評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,606評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,044評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,826評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,227評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,447評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,992評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,807評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,001評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,243評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,667評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,930評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,709評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,996評論 2 374

推薦閱讀更多精彩內容