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管理(一個應用程序的狀態欄都由它統一管理)

```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));
}