代码之家  ›  专栏  ›  技术社区  ›  Chris James

在视图控制器中动态加载iPhone/iPad的NIB

  •  20
  • Chris James  · 技术社区  · 14 年前

    我已经使用Xcode中类似向导的东西将iPhone应用程序转换为通用应用程序。

    它建得很好,但在某些地区显然有点垃圾。)

    我需要根据使用的设备加载笔尖。我不希望使用创建视图控制器 initWithNib 因为我已经有了用一些数据创建控制器的代码( initWithMyLovelyData )与笔尖加载无关。

    我知道要找出你使用的设备 UI_USER_INTERFACE_IDIOM() 所以我试图超越 initWithNibName 在实际的视图控制器内部,假设它们以某种方式被内部调用。但是它没有起作用,我想我对语法不确定。

    我试过了

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

    那不管用:/

    编辑-我知道我已经大量编辑了这个,做了更多的研究后,使我的问题更具体一点-抱歉!

    5 回复  |  直到 10 年前
        1
  •  22
  •   kubi    10 年前

    编辑:@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
  •  75
  •   Adam    13 年前

    实际上,苹果会自动完成所有这些工作,只需命名您的NIB文件:

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

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

    [[MyViewController alloc] initWithNibName:nil bundle:nil]; // Apple will take care of everything
    
        3
  •  2
  •   Dori    14 年前

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

    + (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 关于第一种方法的更多解释…

        4
  •  2
  •   Bogatyr    14 年前

    你也可以吃你的蛋糕。只需添加一个用nibname:bundle:包装init的方法,并添加myLovelyData参数:

    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil  myLovelyData:(id)data
    {
        if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) 
        {
            // Custom initialization using myLovelyData
            //
        }
        return self;
    }
    
        5
  •  0
  •   rowwingman    13 年前

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

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

    文件助手

    #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;
        }   
    }