UIViewController 的 nibName 在 iPad 上为零,但在 iPhone 上不为零

Posted

技术标签:

【中文标题】UIViewController 的 nibName 在 iPad 上为零,但在 iPhone 上不为零【英文标题】:UIViewController's nibName is nill on iPad but not nill on iPhone 【发布时间】:2016-01-08 12:06:06 【问题描述】:

我有一个视图控制器 LoginViewController,其中包括一个 xib 文件 LoginViewController.xib。我在代码中记录了控制器的 nibName。当我在 iPhone 模拟器上运行项目时,nibName 不是 nil,它是正确的 nib 名称,一切正常。但是当我在 iPad 上运行该项目时,nibName 为 nil。

初始化 LoginViewController 的代码是。控制器和 nib 文件位于框架中。

NSBundle *bundle = [NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"FavorLibraryResources" withExtension:@"bundle"]];
LoginViewController *controller = [[LoginViewController alloc] initWithNibName:NSStringFromClass([LoginViewController class]) bundle:bundle];

我发现了问题,我打开了FavorLibraryResources.bundle,里面有一个LoginViewController~iphone.xib 文件。但是xib名称是LoginViewController.xib。似乎 xcode 会自动将 ~iphone 添加到文件名中。但它不会生成 ~ipad 版本的 xib。所以这个 xib 没有在 iPad 上加载。

【问题讨论】:

显示你的 nib 文件名和你初始化这个 nib 的行。 您是否为两者使用不同的 XIB? @jay 我在 iPad 和 iPhone 上使用相同的 xib。 请分享您的代码。 请查看更新后的代码。 【参考方案1】:

请尝试以下代码,并验证 Nib 名称:

NSString * nibName = @"LoginViewController";

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad )
   nibName = @"LoginViewController_iPad";

NSBundle *bundle = [NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"FavorLibraryResources" withExtension:@"bundle"]];
LoginViewController *controller = [[LoginViewController alloc] initWithNibName:nibName bundle:bundle];

【讨论】:

但是没有 LoginViewController_iPad 文件。我必须创建两个 xib 吗? 是的,如果你想要 iPhone 和 iPad 的不同布局,如果没有区别,那么你可以只使用“LoginViewController”作为 nib 名称。 我不希望 iPhone 和 iPad 的布局不同。我只使用LoginViewController 作为笔尖名称。但问题是 nib 文件没有在 iPad 上加载。 @yong ho 私聊吧,,, 确保您的应用程序是通用的,然后为 iphone 使用相同的 nib 名称。然后与我分享你的结果。

以上是关于UIViewController 的 nibName 在 iPad 上为零,但在 iPhone 上不为零的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用情节提要的情况下获取视图控制器的 NibName

在后台线程上创建 UIViewController 可以吗?

获取笔尖名称/笔尖到底是啥?

无法加载 nibName 问题 (xamarin)

无法在包中加载 Nib - 错误的 nibname 错误

iPhone:TableViewController nibName 错误,带有“initWithNibName:bundle:”