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)-項目的唯一辨別。部署到真機時用到
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的設定
在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程式的啟動過程
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之前)