UIApplication和delegate以及程序啓動過程

什麼是UIApplication
UIApplication對象是應用程序的象徵
每一個應用都有自己的UIApplication對象,而且是單例的
通過[UIApplication  sharedApplication]可以獲得這個單例對象
一個iOS程序啓動後創建的第一個對象就是UIApplication對象
利用UIApplication對象,能進行一些應用級別的操作
    UIApplication *app = [UIApplication sharedApplication];
    UIApplication *app1 = [UIApplication sharedApplication];
    UIApplication *app2 = [[UIApplication alloc] init];
    NSLog(@"%p %p %p", app, app1, app2);

這裏錯誤顯示不能調用init方法,而且寫着UIApplication是單例



UIApplication的常用屬性
設置應用程序圖標右上角的紅色提醒數字

@property(nonatomicNSInteger applicationIconBadgeNumber;



 
<span style="font-size:18px;">IOS7:
UIApplication *app = [UIApplication sharedApplication];  
      
// 應用程序右上角數字  
app.applicationIconBadgeNumber = 10;  

上面的代碼可以搞定

IOS8:
iOS8中設置application badge value 會拋錯:Attempting to badge the application icon but haven't received permission from the user to badge the

原因是因爲在ios8中,設置應用的application badge value需要得到用戶的許可。使用如下方法諮詢用戶是否許可應用設置application badge value

UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];

[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
在這之前要判斷系統是否爲iOS8的系統,否則8之前的系統會報錯。

UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];  
      
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];  
      
UIApplication *app = [UIApplication sharedApplication];  
// 應用程序右上角數字  
app.applicationIconBadgeNumber = 10; </span><span style="font-size: 28pt;"> 
</span>

設置聯網指示器的可見性

@property(nonatomic,getter=isNetworkActivityIndicatorVisible) BOOL networkActivityIndicatorVisible;




iOS7中的狀態欄
iOS7開始,系統提供了2種管理狀態欄的方式
Ø通過UIViewController管理(每一個UIViewController都可以擁有自己不同的狀態欄)
Ø通過UIApplication管理(一個應用程序的狀態欄都由它統一管理)
在iOS7中,默認情況下,狀態欄都是由UIViewController管理UIViewController實現下列方法就可以輕鬆管理狀態欄的可見性和樣式
Ø狀態欄的樣式

-(UIStatusBarStyle)preferredStatusBarStyle;

Ø狀態欄的可見性

(BOOL)prefersStatusBarHidden;



利用UIApplication來管理狀態欄
如果想利用UIApplication來管理狀態欄,首先得修改Info.plist的設置


openURL:
UIApplication有個功能十分強大的openURL:方法

-(BOOL)openURL:(NSURL*)url;

-
openURL:方法的部分功能有
Ø打電話

UIApplication *app = [UIApplicationsharedApplication];

[app openURL:[NSURLURLWithString:@"tel://10086"]];

Ø發短信

[app openURL:[NSURLURLWithString:@"sms://10086"]];

Ø發郵件

[app openURL:[NSURLURLWithString:@"mailto://[email protected]"]];

Ø打開一個網頁資源

[app openURL:[NSURLURLWithString:@"http://ios.itcast.cn"]];

Ø打開其他app程序


UIApplicationdelegate
所有的移動操作系統都有個致命的缺點:app很容易受到打擾。比如一個來電或者鎖屏會導致app進入後臺甚至被終止
還有很多其它類似的情況會導致app受到干擾,在app受到干擾時,會產生一些系統事件,這時UIApplication會通知它的delegate對象,讓delegate代理來處理這些系統事件
delegate可處理的事件包括
Ø應用程序的生命週期事件(如程序啓動和關閉)
Ø系統事件(如來電)
Ø內存警告
Ø





每次新建完項目,都有個帶有“AppDelegate”字眼的類,它就是UIApplication的代理

lMJAppDelegate默認已經遵守了UIApplicationDelegate協議,已經是UIApplication的代理


iOS程序的啓動過程



UIApplicationMain
main函數中執行了一個UIApplicationMain這個函數
intUIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);
Øargcargv:直接傳遞給UIApplicationMain進行相關處理即
Ø
ØprincipalClassName指定應用程序類app的象徵),該類必須是UIApplication(或子類)。如果爲nil,UIApplication類作爲默認值
Ø
ØdelegateClassName指定應用程序的代理類,該類必須遵守UIApplicationDelegate協議

UIApplicationMain函數會根據principalClassNameUIApplication象,根據delegateClassName創建一個delegate對象,並將該delegate對象賦值給UIApplication象中的delegate屬性
接着會建立應用程序的Main Runloop(事件循環),進行事件的處理(首先會在程序完畢後調delegate象的application:didFinishLaunchingWithOptions:方法)
程序正常退出時UIApplicationMain函數才返回


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



添加UIViewUIWindow中兩種常見方式:
Ø- (void)addSubview:(UIView *)view;

直接將view添加到UIWindow中,但並不會理會view對應的UIViewController

Ø@property(nonatomic,retainUIViewController *rootViewController;

自動將rootViewControllerview添加到UIWindow,負責管理rootViewController的生命週期

常用方法
Ø- (void)makeKeyWindow;

讓當前UIWindow變成keyWindow(主窗口)

Ø
Ø- (void)makeKeyAndVisible;

讓當前UIWindow變成keyWindow,並顯示出來



UIWindow的獲得
[UIApplicationsharedApplication].windows

在本應用中打開的UIWindow列表,這樣就可以接觸應用中的任何一個UIView

(平時輸入文字彈出的鍵盤就處在一個新的UIWindow)

[UIApplicationsharedApplication].keyWindow

用來接收鍵盤以及非觸摸類的消息事件的UIWindow,而且程序中每個時刻只能有一個UIWindowkeyWindow如果某個UIWindow內部的文本框不能輸入文字,可能是因爲這個UIWindow不是keyWindow

view.window

獲得某個UIView所在的UIWindow




四大對象關係圖







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章