[英]Dynamically load nib for iPhone/iPad within view controller
我已經使用XCode中的向導將iPhone應用程序轉換為通用應用程序。
它建立得很好但顯然在某些方面看起來有點垃圾:)
我需要根據使用的設備加載筆尖。 我不希望使用initWithNib
創建我的視圖控制器,因為我已經有代碼用一些數據創建控制器( initWithMyLovelyData
),它與nib加載沒有任何關系。
我知道要找出你使用UI_USER_INTERFACE_IDIOM()
的設備,所以我嘗試在實際的視圖控制器本身中覆蓋initWithNibName
,假設它們以某種方式在內部調用。 但它不起作用,因為我猜我不確定語法。
我努力了
if(ipad..) self = [super initWithNibName:@"MyIpadNib" bundle:nibBundleOrNil];
這不起作用:/
編輯 - 我知道我已經大量編輯了這個,在做了一些更多的研究之后讓我的問題更加具體 - 道歉!
實際上,Apple會自動執行所有操作,只需命名您的NIB文件:
MyViewController~iphone.xib // iPhone
MyViewController~ipad.xib // iPad
並使用最少量的代碼加載視圖控制器:
[[MyViewController alloc] initWithNibName:nil bundle:nil]; // Apple will take care of everything
編輯:@ Adam的答案是正確的答案。
要確定要加載哪個nib,請執行以下操作,並廢棄initWithMyLovelyData
方法並使用屬性設置數據。 您應該能夠輕松地將所有初始化代碼移動到屬性setter方法中。
MyViewController *viewController;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
viewController = [[MyViewController alloc] initWithNibName:@"ipadNIB" bundle:nil];
} else {
viewController = [[MyViewController alloc] initWithNibName:@"iphoneNIB" bundle:nil];
}
viewController.myLovelyData = someData;
我只是將這兩個方法放在一個名為IPadHelper的類中,並使用addIPadSuffixWhenOnIPad方法根據平台有條件地在兩個筆尖之間進行選擇
+ (BOOL)isIPad{
if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iPhoneOS_3_2){
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad){
return YES;
}
}
return NO;
}
+ (NSString *)addIPadSuffixWhenOnIPad:(NSString *)resourceName{
if([IPadHelper isIPad]){
return [resourceName stringByAppendingString:@"-iPad"];
}
else {
return resourceName;
}
}
請參閱此處h ttp://cocoawithlove.com/2010/07/tips-tricks-for-conditional-ios3-ios32.html以獲取有關第一種方法的更多說明...
你可以吃蛋糕,也可以吃。 只需添加一個包裝initWithNibName:bundle的方法:並添加myLovelyData參數:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil myLovelyData:(id)data
{
if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]))
{
// Custom initialization using myLovelyData
//
}
return self;
}
我認為創建C文件會更好。
FileHelper.h
#import <Foundation/Foundation.h>
BOOL isIPad();
NSString *addIPadSuffixWhenOnIPad(NSString *resourceName);
FileHelper.m
#import "FileHelper.h"
BOOL isIPad() {
if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iPhoneOS_3_2) {
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
return YES;
}
}
return NO;
}
NSString *addIPadSuffixWhenOnIPad(NSString *resourceName) {
if(isIPad()) {
return [resourceName stringByAppendingString:@"-iPad"];
}
else {
return resourceName;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.