裝置指定資源
檔案名稱格式如下:
<basename><device>.<filename_extension>
<basename>表示資源檔的原始名稱,也是代碼訪問該檔案的名稱;
<filename_extension>就是標準的副檔名;
<device>表示裝置指定修飾符:
~ipad:只用在iPad裝置上
~iphone:只用在iPhone或iPod touch裝置上。
資源載入路由:
如果裝置指定資源不存在,系統才會去尋找以原始檔案名命名的資源檔。
字串資源
建立字串資源檔
1、選擇需要本地化的字串
2、字串載入宏
Core Foundation宏:
CFCopyLocalizedString
CFCopyLocalizedStringFromTable
CFCopyLocalizedStringFromTableInBundle
CFCopyLocalizedStringWithDefaultValue
Foundation宏:
NSLocalizedString
NSLocalizedStringFromTable
NSLocalizedStringFromTableInBundle
NSLocalizedStringWithDefaultValue
上述宏擷取目前使用者語言喜好設定對應的字串值,另外,genstrings工具通過搜尋這些宏來構建字串檔案。
3、使用genstrings命令列工具建立字串檔案
genstrings -o en.lproj *.m
-o參數指定輸出檔案
*.m指定原始碼檔案名稱的萬用字元
格式化字串資源
使用n$引用源字串中的指定位置的預留位置
/* Message in alert dialog when something fails */
"%@ Error! %@ failed!" = "%2$@ blah blah, %1$@ blah!";
在字串資源中使用特別字元
逸出字元\
Unicode字元\uxxxx(必須傳遞給genstrings工具-u參數)
調試字串資源
plutil -lint
映像、聲音、剪輯資源
iOS 4.0高解析度影像檔格式如下:
<basename>@2x.<filename_extension>
Note:@2x修飾符應該在任何裝置修飾符之前,其他修飾符(方向、URL模式)之後。
Nib資源
Nib檔案一覽
Interface對象
Interface對象是添加至Interface Builder文檔中實現使用者介面的元素。當nib檔案在運行時被載入時,Interface對象就是nib載入代碼實際建立的對象。
File's Owner
File's Owner對象是個代理對象,並不是在nib檔案載入時建立,相反,你需要在自己的代碼中建立並傳遞給nib載入的代碼。該對象的重要性體現在其為應用程式代碼和nib檔案內容的主要串連。特別地,其是負責nib檔案內容的控制對象。
First Responder
First Responder對象是個代理對象,表示應用程式動態確定的響應者鏈的第一個對象。因為不能在設計時就確定應用程式的響應者鏈,First Responder代理作為響應者鏈中接受行為訊息的替代目標。
Top-Level Objects
Top-Level對象是nib檔案載入後,對象圖中沒有父物件的對象。File’s Owner、First Responder和Application對象是代理對象,不是Top-level對象。
載入Nib檔案
通過NSBundle載入
- (NSArray *)loadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)options;
owner參數即File's Owner對象。
返回Top-Level對象的數組。
通過UIViewController載入
- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle;
File's Owner對象為UIViewController對象本身。
Nib檔案設計指南
消極式載入——nib檔案只包含立即引用的對象,不是載入完成時就引用的對象放在另一個nib檔案中,直到實際引用時再載入。
Nib對象的生命週期
載入過程
1、載入nib檔案的內容和所有引用資源至記憶體
●載入歸檔的整個nib對象圖的未經處理資料
●載入關聯的所有自訂的映像資源並加入映像緩衝
●載入關聯的所有自訂的聲音資源並加入聲音緩衝(iOS是否有?)
2、逆歸檔對象圖並初始化對象
●標準的IB對象(包括這些對象所屬類的子類的對象)通過initWithCoder:初始化
在iOS中,任何實現NSCoding協議的對象都通過initWithCoder:方法初始化,包括UIView和UIViewController及其子類
●其他自訂對象通過init方法初始化
3、建立所有nib檔案中對象間的串連(包括action、outlet和binding)
●Outlet串連
iOS通過setValue:forKey:方法重建outlet串連,會產生KVO通知。
●Action串連
iOS通過addTarget:action:forControlEvents:方法配製action,如果target為nil,action會被響應者鏈處理。
●binding
iOS不支援
4、發送awakeFromNib訊息給相應的對象,發此訊息的順序無法保證。iOS不發送該訊息給File’s Owner、First Responder和其他代理對象。
5、顯示所有“Visible at launch time”為真的視窗。
Nib檔案的內建支援
可以通過Info.plist檔案中的NSMainNibFile關鍵字指定應用程式載入主視窗Nib檔案。
載入時替換代理對象
代理對象表示在nib檔案之外建立單與nib檔案的內容有串連的對象。
- (void)applicationDidFinishLaunching:(UIApplication *)application {
NSArray* topLevelObjs = nil;
NSDictionary* proxies = [NSDictionary dictionaryWithObject:self forKey:@"AppDelegate"]; // nib檔案中的標籤
NSDictionary* options = [NSDictionary dictionaryWithObject:proxies forKey:UINibExternalObjects];
topLevelObjs = [[NSBundle mainBundle] loadNibNamed:@"Main" owner:self options:options];
if ([topLevelObjs count] == 0) {
NSLog(@"Warning! Could not load myNib file.\n");
return;
}
// Show window
[window makeKeyAndVisible];
}