Info.plist常見的設置
建立一個工程後,會在Supporting files文件夾下看到一個“工程名-Info.plist”的文件,該文件對工程做一些運行期的配置,非常重要,不能刪除
注:在舊版本Xcode創建的工程中,這個配置文件的名字就叫“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文件夾下面有個“工程名-Prefix.pch”文件,也是一個頭文件
pch頭文件的內容能被項目中的其他所有源文件共享和訪問
一般在pch文件中定義一些全局的宏<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPtTacGNozsS8/tbQzO2808/CwdDUpLSmwO3WuMHuo6zIu7rz1NrP7sS/1tDKudPDTG9nKCZoZWxsaXA7KcC0yuSz9sjV1r7Qxc+io6y+zb/J0tTU2reisrzTptPDtcTKsbryo6zSu7TO0NS9q05TTG9n0+++5NLGs/2jqNTatffK1MSjyr3PwqOsssXT0Lao0uVERUJVR6OpPC9wPg0KPHByZSBjbGFzcz0="brush:java;">
#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之前)
四大對象關系圖
生命周期方法