控制器管理

UIApplication

UIApplication是單例,不能手動創建,不能alloc init,用[UIApplication sharedApplication]來獲得

作用 --- 做應用級別的操作

  • 1.設置圖標消息數字
    UIApplication * app = [UIApplication sharedApplication];
    app.applicationIconBadgeNumber = 10;
    UIUserNotificationSettings * setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
    [app registerUserNotificationSettings:setting];
    ```
- 2.設置狀態欄
  - 從iOS7開始,系統提供了2種管理狀態欄的方式,UIViewController管理和UIApplication管理
  - 默認情況下,狀態欄都是由UIViewController管理的,UIViewController實現下列方法就可以輕松管理狀態欄的可見性和樣式
    - 狀態欄的樣式
     ```objc
      (UIStatusBarStyle)preferredStatusBarStyle;
      ```
    - 狀態欄的可見性
      ```objc
      (BOOL)prefersStatusBarHidden;
       ```
  - 通過UIApplication管理(一個應用程序的狀態欄都由它統一管理)
      
    ![UIApplication設置狀態欄.png](http://upload-images.jianshu.io/upload_images/641084-47eb88c997cdf901.png)

   ```objc
 UIApplication * app = [UIApplication sharedApplication];
 [app setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];
  • 3.打開一個資源
    UIApplication打開資源的好處:不用判斷用什么軟件打開,系統會自動根據 協議頭判斷:http/ftp/tel/

UIApplicationMain

  • main函數中執行了一個UIApplicationMain這個函數
int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);

argc、argv:直接傳遞給UIApplicationMain進行相關處理即可

principalClassName:指定應用程序類名(app的象征),該類必須是UIApplication(或子類)。如果為nil,則用UIApplication類作為默認值

delegateClassName:指定應用程序的代理類,該類必須遵守UIApplicationDelegate協議

UIWindow

什么是UIWindow?

  • UIWindow是一種特殊的UIView,通常在一個app中只會有一個UIWindow
  • iOS程序啟動完畢后,創建的第一個視圖控件就是UIWindow,接著創建控制器的view,最后將控制器的view添加到UIWindow上,于是控制器的view就顯示在屏幕上了
  • 一個iOS程序之所以能顯示到屏幕上,完全是因為它有UIWindow,也就說,沒有UIWindow,就看不見任何UI界面

UIWindow的創建

// 1.創建窗口,注意窗口必須要有尺寸,尺寸跟屏幕一樣大的尺寸,窗口不要被釋放
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor = [UIColor redColor];

// 2.創建窗口的跟控制器
UIViewController *vc = [[UIViewController alloc] init];
vc.view.backgroundColor = [UIColor yellowColor];

// 3.設置窗口的跟控制器,設置后默認就會把控制器的view添加到窗口上
self.window.rootViewController = vc;

// 4.顯示窗口
[self.window makeKeyAndVisible];

UIWindow的層級關系

// 設置窗口的層級關系
self.window1.windowLevel = UIWindowLevelStatusBar;
// 窗口的層級關系
 UIWindowLevelNormal < UIWindowLevelStatusBar < UIWindowLevelAlert

UIWindow創建控制器(通過storyboard)

self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];

// 通過storyboard創建控制器
// instantiateInitialViewController:加載箭頭指向的控制器
//UIViewController * vc = [storyboard instantiateInitialViewController];

ViewController * vc = [storyboard instantiateViewControllerWithIdentifier:@"purple"];

self.window.rootViewController = vc;

[self.window makeKeyAndVisible];

UIWindow創建控制器(通過xib)

self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
//nibName傳nil值的時候,controller加載xib的步驟:
1.先查找有無View這個xib,有則加載該xib
2.查找有無ViewController.xib,有則加載
ViewController * vc = [[ViewController alloc]initWithNibName:nil bundle:nil];
self.window.rootViewController = vc;
[self.window makeKeyAndVisible];

加載控制器的View

view的懶加載過程

- (UIView *)view
{
   if (_view == nil) {
      [self loadView];
      [self viewDidLoad];
   }
   return _view;
}

loadView

  • 調用loadView時,如果有storyboard或者xib,會根據對應的描述去創建view,如果沒有,則會創建一個空白的view
  • 如果重寫了loadView,則系統不會去加載storyboard或者xib描述的view
// loadView作用:自定義控制器的view

// loadView什么時候調用:第一次使用控制器的view的時候調用

// 注意:在這個方法中如果沒有自定義view,就不能獲取控制器的view

// 一旦重寫了這個方法,就不要調用[super loadView]
// 如果重寫了這個方法,就不會去加載storyboard描述的控制器的View
- (void)loadView
{
   // 創建控制器view
   self.view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
   self.view.backgroundColor = [UIColor purpleColor];
}

viewDidLoad

  • 在viewDidLoad中打印控制器的尺寸不準確,通常在viewDidAppear中打印
#pragma mark - 控制器的view加載完成的時候調用
- (void)viewDidLoad {

}

#pragma mark - view完全顯示的時候調用
- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    NSLog(@"%@",NSStringFromCGRect(self.view.bounds));

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容