在视图控制器中为iPhone/iPad动态加载笔尖

qui*_*qui 20 iphone objective-c universal ipad

我已经使用XCode中的向导将iPhone应用程序转换为通用应用程序.

它建立得很好但显然在某些方面看起来有点垃圾:)

我需要根据使用的设备加载笔尖.我不希望创建我的视图控制器,initWithNib因为我已经有代码来创建带有一些数据(initWithMyLovelyData)的控制器,它与nib加载没有任何关系.

我知道要找出你使用的设备,UI_USER_INTERFACE_IDIOM()所以我尝试覆盖initWithNibName实际的视图控制器本身,假设它们以某种方式在内部调用.但它不起作用,因为我猜我不确定语法.

我试过了

if(ipad..) self = [super initWithNibName:@"MyIpadNib" bundle:nibBundleOrNil];
Run Code Online (Sandbox Code Playgroud)

这不起作用:/

编辑 - 我知道我已经大量编辑了这个,在做了一些更多的研究之后让我的问题更加具体 - 道歉!

Ada*_*dam 75

实际上,Apple会自动执行所有操作,只需命名您的NIB文件:

MyViewController~iphone.xib // iPhone
MyViewController~ipad.xib // iPad
Run Code Online (Sandbox Code Playgroud)

并使用最少量的代码加载视图控制器:

[[MyViewController alloc] initWithNibName:nil bundle:nil]; // Apple will take care of everything
Run Code Online (Sandbox Code Playgroud)

  • 如果你使用这个语句:[MyViewController alloc] init]; 在上面的例子中,它是完全相同的事情吗?还是它做了一些略有不同的事情? (2认同)
  • [[MyViewController alloc] init]与[[MyViewController alloc] initWithNibName完全相同:nil nibBundle:nil]这在UIViewController.h文件中提到:"如果你是UIViewController的子类,你必须调用这个方法的超级实现,即使您没有使用NIB.(为方便起见,默认的init方法将为您执行此操作,并为这两个方法参数指定nil.)" (2认同)
  • 只想添加描述"iOS支持特定于设备的资源"的文档的位,可以在这里找到:https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/LoadingResources/Introduction/ Introduction.html (2认同)

kub*_*ubi 22

编辑:@ 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;
Run Code Online (Sandbox Code Playgroud)

  • FWIW,@ adam的回答是正确的,也比这更好. (5认同)