21

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

它构建得很好,但在某些区域显然看起来有点垃圾:)

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

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

我努力了

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

那不起作用:/

编辑-我知道我已经对此进行了大量编辑,在进行了更多研究后使我的问题更加具体-抱歉!

4

5 回答 5

77

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

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

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

[[MyViewController alloc] initWithNibName:nil bundle:nil]; // Apple will take care of everything
于 2012-03-07T15:04:18.340 回答
22

编辑:@Adam 下面的答案是正确的答案。

要确定要加载哪个 nib,请执行以下操作,然后废弃您的initWithMyLovelyData方法并使用属性来设置数据。您应该能够轻松地将所有初始化代码移动到属性设置器方法中。

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;
于 2010-06-16T11:02:17.730 回答
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;
}
于 2010-10-09T07:57:06.620 回答
2

我只是将这两个方法放在一个名为 IPadHelper 的类中,并使用 addIPadSuffixWhenOnIPad 方法根据平台有条件地在两个 nib 之间进行选择

+ (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 ...

于 2010-10-04T09:22:06.740 回答
0

我认为创建C文件会更好。
文件助手.h

#import <Foundation/Foundation.h>
BOOL isIPad();
NSString *addIPadSuffixWhenOnIPad(NSString *resourceName);

文件助手.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;
    }   
}
于 2012-01-17T22:13:42.073 回答