2010-06-16 118 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