我已经使用XCode中的向导将iPhone应用程序转换为通用应用程序。
它建立得很好,但在某些方面显然看起来有点垃圾:)
我需要根据正在使用的设备加载nib。我不希望使用initWithNib
创建我的视图控制器,因为我已经有代码来创建带有一些数据(initWithMyLovelyData
)的控制器,这些数据与nib加载无关。
我知道要找出你使用的设备UI_USER_INTERFACE_IDIOM()
,所以我尝试覆盖实际视图控制器本身内的initWithNibName
,假设它们以某种方式在内部调用。但它不起作用,因为我猜我不确定语法。
我试过了
if(ipad..) self = [super initWithNibName:@"MyIpadNib" bundle:nibBundleOrNil];
这不起作用:/
编辑 - 我知道我已经对此进行了大量编辑,在做了更多研究之后让我的问题更加具体 - 道歉!
答案 0 :(得分:75)
实际上,Apple会自动完成所有这些操作,只需命名您的NIB文件:
MyViewController~iphone.xib // iPhone
MyViewController~ipad.xib // iPad
并使用最少量的代码加载视图控制器:
[[MyViewController alloc] initWithNibName:nil bundle:nil]; // Apple will take care of everything
答案 1 :(得分:22)
编辑:@ Adam的答案是正确的答案。
要确定要加载哪个笔尖,请执行以下操作,并废弃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;
答案 2 :(得分: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了解有关第一种方法的更多说明......
答案 3 :(得分: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;
}
答案 4 :(得分: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;
}
}