加载不同的 Nib 文件

Posted

技术标签:

【中文标题】加载不同的 Nib 文件【英文标题】:Loading the Different Nib Files 【发布时间】:2011-06-08 14:31:28 【问题描述】:

我为 iPhone 和 iPad 创建了两个 nib 文件,所以我的应用程序将是通用的。

我用这个方法来检查是不是iPad:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)

但是当它知道它是哪个时,我不知道如何加载正确的笔尖。

有谁知道加载到 nib 文件的正确方法?

【问题讨论】:

加载一个nib文件究竟是做什么的?笔尖可用于许多事情。这些笔尖是否包含 UIViewController 的视图或其他对象图?您可以使用NSBundleUINib 类或UIViewController-initWithNibNamed:options: 方法加载笔尖。哪个合适取决于笔尖包含的内容以及您使用这些对象的目的。 【参考方案1】:

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

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

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

[[MyViewController alloc] initWithNibName:nil bundle:nil]; // Apple will take care of everything

【讨论】:

【参考方案2】:

你的接口文件应该命名不同,这样这样的东西应该可以工作。

UIViewController *someViewController = nil;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)

    someViewController = [[UIViewController alloc] initWithNibName:@"SomeView_iPad" bundle:nil];

else

    someViewController = [[UIViewController alloc] initWithNibName:@"SomeView" bundle:nil];

【讨论】:

【参考方案3】:

您应该使用初始化程序-[UIViewController initWithNibNamed:bundle:];。 在您的 SomeViewController.m 中:

- (id)init 
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
        if (nil != (self = [super initWithNibName:@"SomeViewControllerIPad"])) 
            [self setup];
        
     else 
        if (nil != (self = [super initWithNibName:@"SomeViewControllerIPhone"])) 
            [self setup];
        
    
    return self;

【讨论】:

以上是关于加载不同的 Nib 文件的主要内容,如果未能解决你的问题,请参考以下文章

从 nib 文件加载 UIView?

如何显示从单独的 NIB 文件加载的子视图

快速加载 nib 文件

在 iOS 上的一个 UITableView 中加载两个不同的 nib

如何从 nib 文件加载 UITableViewCell 高度?

如何在 iOS 中从 NIB 加载 NIB