天天看點

Info.plist和pch檔案的作用,UIApplication,iOS程式的啟動過程,AppDelegate 方法解釋,UIWindow,生命周期方法

Info.plist常見的設定

建立一個project後,會在Supporting files目錄下看到一個“project名-Info.plist”的檔案,該檔案對project做一些執行期的配置,很重要。不能删除

注:在舊版本号Xcode建立的project中,這個配置檔案的名字就叫“Info.plist”

項目中其它Plist檔案不能帶有“Info”這個字眼,不然會被錯覺得是傳說中很重要的“Info.plist”

項目中另一個InfoPlist.strings的檔案,跟Info.plist檔案的本地化相關

Info.plist常見屬性

Localiztion native development region(CFBundleDevelopmentRegion)-本地化相關

Bundle display name(CFBundleDisplayName)-程式安裝後顯示的名稱,限制在10-12個字元,假設超出,将被顯示縮寫名稱

Icon file(CFBundleIconFile)-app圖示名稱,一般為Icon.png

Bundle version(CFBundleVersion)-應用程式的版本号号,每次往App Store上公布一個新版本号時。須要添加這個版本号号

Main storyboard file base name(NSMainStoryboardFile)-主storyboard檔案的名稱

Bundle identifier(CFBundleIdentifier)-項目的唯一辨別。部署到真機時用到

Info.plist和pch檔案的作用,UIApplication,iOS程式的啟動過程,AppDelegate 方法解釋,UIWindow,生命周期方法

pch檔案

項目的Supporting files目錄以下有個“project名-Prefix.pch”檔案,也是一個頭檔案

pch頭檔案的内容能被項目中的其它全部源檔案共享和訪問

一般在pch檔案裡定義一些全局的宏

在pch檔案裡加入下列預處理指令,然後在項目中使用Log(…)來輸出日志資訊,就能夠在公布應用的時候,一次性将NSLog語句移除(在調試模式下,才有定義DEBUG)

#ifdef DEBUG 
#define Log(...) NSLog(__VA_ARGS__) 
#else 
#define Log(...) 
#endif           

UIApplication

UIApplication對象是應用程式的象征

每個應用都有自己的UIApplication對象,并且是單例的

通過[UIApplication sharedApplication]能夠獲得這個單例對象

UIApplication *appDelgate = [UIApplication sharedApplication];  
    UIApplication *appDelegate1 = [UIApplication sharedApplication];  
//    UIApplication *appDelegate2 = [[UIApplication alloc] init];  //會出錯。  
    NSLog(@"%p - %p", appDelgate, appDelegate1); // 列印顯示同一個位址             

一個iOS程式啟動後建立的第一個對象就是UIApplication對象

利用UIApplication對象,能進行一些應用級别的操作

如:

UIApplication *app = [UIApplication sharedApplication];  
 app.applicationIconBadgeNumber = 998; // 設定應用程式圖示上的數字  
 app.networkActivityIndicatorVisible = YES; // 設定狀态欄的聯網動畫  


 // 設定狀态欄的樣式  
 // app.statusBarStyle = UIStatusBarStyleLightContent;  // 與以下方法的差别在于,不可設定動畫。           

[app setStatusBarStyle:UIStatusBarStyleLightContent animated:YES]; // 設定狀态欄是否隐藏 app.statusBarHidden = YES; // 與以下方法的差别在于,不可設定動畫。 [app setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade]; NSURL *url = [NSURL URLWithString:@"http://ios.itcast.cn"]; [app openURL:url];

注:iOS7中 假設想利用UIApplication來管理狀态欄。首先得改動Info.plist的設定

Info.plist和pch檔案的作用,UIApplication,iOS程式的啟動過程,AppDelegate 方法解釋,UIWindow,生命周期方法

在iOS7中,預設情況下。狀态欄都是由UIViewController管理的。UIViewController實作下列方法就能夠輕松管理狀态欄的可見性和樣式

狀态欄的樣式

- (UIStatusBarStyle)preferredStatusBarStyle;              

狀态欄的可見性

-(BOOL)prefersStatusBarHidden;             

openURL

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

openURL:方法的部分功能有

打電話 ,發短信,發郵件,打開一個網頁資源

// 打電話   
UIApplication *app = [UIApplication sharedApplication];   
[app openURL:[NSURL URLWithString:@"tel://10086"]];  
// 發短信   
[app openURL:[NSURL URLWithString:@"sms://10086"]];   
// 發郵件   
[app openURL:[NSURL URLWithString:@"mailto://[email protected]"]];  
// 打開一個網頁資源   
[app openURL:[NSURL URLWithString:@"http://ios.itcast.cn"]];             

iOS程式的啟動過程

Info.plist和pch檔案的作用,UIApplication,iOS程式的啟動過程,AppDelegate 方法解釋,UIWindow,生命周期方法

UIApplication和delegate

delegate可處理的事件包含:

應用程式的生命周期事件(如程式啟動和關閉)

系統事件(如來電)

記憶體警告

main函數中執行了一個UIApplicationMain這個函數

int UIApplicationMain(int argc, char *argv[], NSString * __nullable principalClassName, NSString * __nullable delegateClassName);           

argc 傳入了幾個參數

argv 傳入參數的值

principalClassName:指定應用程式類名(app的象征),該類必須是UIApplication(或子類)。

假設為nil,則用UIApplication類作為預設值

delegateClassName:指定應用程式的代理類。該類必須遵守UIApplicationDelegate協定

AppDelegate 方法解釋

// 當應用程式啟動完成的時候就會調用(系統自己主動調用)  
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions  
{  
    return YES;  
}  
// 即将失去活動狀态的時候調用(失去焦點, 不可互動)  
- (void)applicationWillResignActive:(UIApplication *)application  
{  
}  

// 又一次擷取焦點(能夠和使用者互動)  
- (void)applicationDidBecomeActive:(UIApplication *)application  
{  

}  

// 應用程式進入背景的時候調用  
// 一般在該方法中儲存應用程式的資料, 以及狀态  
- (void)applicationDidEnterBackground:(UIApplication *)application  
{  

}  

// 應用程式即将進入前台的時候調用  
// 一般在該方法中恢複應用程式的資料,以及狀态  
- (void)applicationWillEnterForeground:(UIApplication *)application  
{  

}  

// 應用程式即将被銷毀的時候會調用該方法  
// 注意:假設應用程式處于挂起狀态的時候無法調用該方法  
- (void)applicationWillTerminate:(UIApplication *)application  
{  

}  

// 應用程式接收到記憶體警告的時候就會調用  
// 一般在該方法中釋放掉不須要的記憶體  
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application  
{  

}             

UIWindow

UIWindow是一種特殊的UIView,通常在一個app中僅僅會有一個UIWindow

iOS程式啟動完成後,建立的第一個視圖控件就是UIWindow,接着建立控制器的view,最後将控制器的view加入到UIWindow上,于是控制器的view就顯示在螢幕上了

一個iOS程式之是以能顯示到螢幕上,全然是由于它有UIWindow

也就說。沒有UIWindow,就看不見不論什麼UI界面

建立UIWindow對象和設定window根視圖控制器的代碼例如以下:

// 程式啟動完成之後就會調用一次。(AppDelegate中的方法)  
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions  
{  
       //建立window
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    //建立視圖控制器
    RootViewController *rootVC = [[RootViewController alloc] init];
    //指定window的根視圖控制器
    self.window.rootViewController = rootVC;
    //讓window成為主窗體并且可視
    [self.window makeKeyAndVisible]; 

}             

UIWindow的獲得

// 擷取應用程式的主窗體  
    NSLog(@"%@", [UIApplication sharedApplication].keyWindow);  

// 獲得某個UIView所在的UIWindow   
view.window             

注:用來接收鍵盤以及非觸摸類的消息事件的UIWindow,并且程式中每個時刻僅僅能有一個UIWindow是keyWindow。假設某個UIWindow内部的文本框不能輸入文字,可能是由于這個UIWindow不是keyWindow(特别是IOS7之前)