2010-06-16 119 views
20

我已經使用嚮導(如XCode中的東西)將iPhone應用程序轉換爲通用應用程序。在視圖控制器中爲iPhone/iPad動態加載筆尖

它建立罰款,但顯然看起來在某些方面有點廢話:)

我需要加載碎粒根據正在使用的設備。我不希望創建我的視圖控制器使用initWithNib,因爲我已經有代碼來創建控制器與一些數據(initWithMyLovelyData)這不會做任何事情與筆尖加載。

我知道找出你使用的設備UI_USER_INTERFACE_IDIOM(),所以我試圖覆蓋實際視圖控制器本身內的initWithNibName,假設它們以某種方式被內部調用。但它不工作,因爲我想我不確定語法。

我已經試過

if(ipad..) self = [super initWithNibName:@"MyIpadNib" bundle:nibBundleOrNil]; 

這不工作:/

編輯 - 我知道我有大量編輯這一點,使我的問題更具體一點做一些調查研究後 - 的歉意!

+0

順便說一句,請不要lmgtfy。 – Will 2010-11-23 15:40:24

回答

22

編輯:@ Adam的答案在下面是正確的答案。

要確定要裝入哪個筆尖,請執行以下操作並取消您的initWithMyLovelyData方法並使用屬性來設置數據。你應該能夠很容易地將所有的init代碼移入屬性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; 
+0

抱歉挖掘舊(呃)帖子,但:這不適合我。有任何想法嗎? – Linuxmint 2011-03-15 00:08:10

+0

@Linuxmint你有什麼問題? – kubi 2011-03-15 09:21:51

+0

http:// stackoverflow。com/questions/5306346/trouble-with-loading-a-separate-xib-for-ipad-or-iphone – Linuxmint 2011-03-15 18:11:44

2

我只是把這兩種方法在一個名爲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爲先的更多解釋方法...

+0

編譯器說這是錯誤的,因爲Class方法應該返回對象(id)。所以如果認爲將它添加到C文件會更好。 – rowwingman 2012-01-17 22:10:41

2

你可以吃你的蛋糕,也可以吃它。只需添加一個包裝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; 
} 
0

我認爲創建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; 
    } 
} 
74

事實上,蘋果確實這一切自動完成,只是命名您的NIB文件:

MyViewController~iphone.xib // iPhone 
MyViewController~ipad.xib // iPad 

,並與加載您的視圖控制器最小的代碼量:

[[MyViewController alloc] initWithNibName:nil bundle:nil]; // Apple will take care of everything 
+2

如果你使用這個語句:[MyViewController alloc] init];在上面的例子中,它是否完全一樣?或者它做的事情稍有不同? – hokkuk 2012-03-09 16:24:17

+0

我希望「init」什麼都不做。如果你想讓它加載一個NIB,你需要調用initWithNib - 否則手動從包 – Adam 2012-03-10 14:50:58

+2

[[MyViewController alloc] init]加載一個NIB與[[MyViewController alloc] initWithNibName:nil nibBundle:nil]完全相同在UIViewController.h文件中提到:「如果你繼承了UIViewController,那麼即使你沒有使用NIB,你也必須調用這個方法的超級實現(爲方便起見,默認的init方法會爲你做到這一點, 併爲這兩個方法參數指定nil。)「 – jsd 2012-07-25 22:00:19