无法在捆绑包中加载 NIB

我试图集成 Janrain Engage 作为定制模块与 Appcelerator 钛。我已经创建了一个示例模块,并将 JREngage 文件夹拖动到示例模块 xcodeproj,如 Jainrain 的文档所示。

现在我给这个项目下达构建命令,然后执行 ./build.py,最后执行 titanium run命令。它在模拟器中以空白屏幕启动应用程序,然后立即崩溃,抛出以下错误。

由于未捕获的异常而终止应用程序“ NSInternalInconcencyException”,原因: “无法在捆绑包中加载 NIB: “ NSBundle (load)”,名称为“ JRProvidersController”

为什么会发生这种错误?

195156 次浏览

这个错误意味着没有名为 "JRProvidersController"的.xib 文件。 重新检查 JRProvidersController.xib是否存在。

你将载入 .xib file

controller = [[JRProvidersController alloc] initWithNibName:@"JRProvidersController" bundle:nil];

我遇到了同样的问题(例外情况是‘不能在 bundle 中加载 NIB: 。.’)后,我的 xcode 从3.2升级到4.02。尽管用 Xcode 3.2部署我的应用程序工作得很好,但是 Xcode 4引发了上面提到的异常——但是只有当我试图部署到 IOS Simulator (v. 4.2)时才会崩溃。瞄准 IOS 设备(v. 4.1)也与 Xcode 4一起起作用。

事实证明(经过几个小时的拼命搜索之后) ,原因是.xib 文件中的一个几乎“隐藏”的设置:

访问文件检查器中. xib 文件的属性: 对于所有.xib 文件,属性“ Location”设置为“ RelatedGroup”。 我把它改为“相对于项目”,瞧: 所有的.xib 文件现在都正确了 装入 IOS 模拟器!

我不知道这种奇怪的 Xcode4行为背后的原因是什么,但也许值得尝试一下?

在将我的旧代码从 XCode3x 转换为 XCode4和 通过将 wwww.xib 重命名为 RootViewController.xib 解决了这个问题

我也遇到了同样的问题。在我的示例中,笔名为“ MyViewController.xib”,我将其重命名为“ MyView.xib”。这消除了错误。

我还将一个项目从 XCode 3移动到4.2。

当构建目标是我的 iOS 设备之一时,我右键单击 Product file (xyzw.app)并选择 Show in Finder 弹出项。它打开了一个包含 xyzw.app 的窗口; 我使用 Show Package Content 打开了捆绑包,看到了所有我想要的文件,除了一个文件,它抱怨的那个,名字中大写的 I 而不是小写的 i (zoomieVIew.nib 而不是 zoomieView.nib)。我已经注意到 xib 文件名中的大写字母 I,并对其进行了更改和重新构建; 显然 Xcode 留下了生成的。一字不差的命名。我删除了包中的 zoomieVIew.nib,重新构建了它,并且 Xcode 适时地将该文件重新创建为 zoomieView.nib。应用程序开始在设备上工作。

还有一个原因可能是,当你搞乱本地化时,在错误的语言特定文件夹中查找文件。

类的属性。在 xib 文件的文件检查器中,属性“目标成员”位于选择框上,然后将你的 xib 文件链接到你的目标

试图找出所有

XXXController = [[XXXControlloer alloc] initWithNibName:@"XXXController" bundle:nil];

在您的代码中,并确保 XXXController拼写正确

Targets -> Build Phases

确保将.xib 添加到 Copy Bundle Resources,如果没有,则添加.xib 文件。

我还发现,当我试图加载名为@“ MyFile.XIB”的 XIB 时,它失败了。当我刚刚使用@“ MyFile”时,它起作用了——显然它总是添加扩展名。但是错误消息只是说它无法在捆绑包中找到 MyFile.xib ——如果它说的是 MyFile.xib.xib,那将是一个很大的线索。

每次我重构我应用程序中的视图控制器的名称时,我都会在这上面浪费时间。重构不会改变 initWithNibName 中的 nib 名称:@“ MYOldViewControllerName”。

在处理 Xcode 4.6.3和本地化 NIB 文件时,我也遇到了这个问题。

对我来说,除了将文件检查器中的“文档版本控制”更改为 Deployment 5.0而不是6.1之外,没有其他任何帮助。

重命名 nib 文件时会发生这种情况。如果您已经创建了新的 nib (意味着将当前 nib 文件内容复制到 new nib) ,删除旧的 nib 文件,它将解决您的问题。

编辑: 新的 Xcode 开始于4.6.3版本,如果您重命名(具有重构功能) Controller 类,它也会重命名 nib 文件,您不必担心 nib 加载问题。

在我的情况下,这是非常奇怪的(使用故事板) : 由于某种原因,它从“主要故事板文件基名称”改为“主要笔尖文件基名称”在清单中。

改回“ Main Storyboard file base name”(UIMainStoryboardFile)解决了这个问题

看看这个项目

Target -> Build Phases -> Copy Bundle Resources

你会发现你的 XIB/Storyborad 是红色的。

只要删除它。同时删除项目中丢失文件的所有引用。

现在再次将这个故事板/xib 文件拖动到这个 Copy Bundle Resources。它仍然会显示红色的文件,但是不用担心。

只是清洁和建设项目。

现在您将使您的项目再次成功运行! !

我遇到了同样的问题,在情节串连图板中重命名我的视图控制器标识符对我很有用。

我注意到,如果你在 git 中的树枝之间切换而忘记清理,这种情况可能会发生。所以 xib 已经存在,并且所有内容都已经找到,但是确切的构建可能存在问题。以防万一,别忘了洗个澡

SecondViewController *secondViewController = [[SecondViewController alloc]initWithNibName:@"SecondView.xib" bundle:nil];
[self.navigationController pushViewController:secondViewController animated:YES];

在上面的代码中,如果您还给出了一个文件扩展名,比如“ SecondView.xib”,那么它就是错误的,并且会给出上面的错误。改用「第二视图」。我犯了那个错误。

我刚刚用 Xcode 6.3得到了一个有趣的体验。

我也一直得到这个错误,尽管尝试一切你通常认为与拼写,目标成员,等建议上面。我还尝试了清理、删除派生数据,并多次从模拟器中删除应用程序,以确保正确构建捆绑包,但没有用。

最后,根据布莱恩 · 迈克尔 · 本特利的回答,我终于决定检查我的。应用程序文件在我的模拟器的文件夹在我的高清。我发现所有的笔尖都在那里,但是使用的是 abc ~ ipad.nib 而不是预期的 abc.nib。我手动重命名所有这些文件删除 ~ ipad 的部分,建立和它的工作!

为了弄清楚为什么这些文件被添加了 ~ iPad 关键字,我查看了我的项目设置,事实上,在我的 General > Deployment Info 标签页中,我只选择了 iPad。我试着在 iPhone 模拟器上运行。我相信在过去,Xcode 会给出一个错误,表明二进制文件不支持 iPhone,你不能成功运行这个应用程序。

我从模拟器中删除了这个应用程序,再次做了同样的事情——同样只支持 iPad。这次。应用程序包含了每个预期的故事板的 abc ~ iPhone.nib 和 abc ~ ipad.nib,它在 iPhone 模拟器上运行得很好。同样-如果我们选择 iPad 只在我们的部署信息设置,它不应该运行在 iPhone 模拟器。这是个 Xcode 错误。

所以,在 Xcode 方面有一些不一致的行为,不幸的是,这是一个间歇性的错误,这可能很难再现,但我把这个放在这里,以便它可以帮助其他人在未来。

这是为我工作. 。 确保键入的笔名正确。

[[ NSBundlemainBundle ] loadNibName:@“ Graphview”owner: self options: nil ] ;

Graphview (笔名)

如果您在项目中使用框架,您需要确保从正确的包中加载:

NSBundle *bundle = [NSBundle bundleWithIdentifier:@"<your bundle id here>"];
ABCViewController *vc = [[ABCViewController alloc] initWithNibName:@"<your nib name>" bundle:bundle];

有同样的问题,没有工作,所以我认为一些奇怪的派生数据。

在 xcode 6.3.2中,我必须:

在 XCode 菜单中—— > 首选项—— > 位置选项卡—— > 位置中将派生数据更改为相对,然后切换回默认值

然后笔尖上膛。

我在使用故事板时遇到了这个问题,这个笔尖被命名为“ bKD-J3-fhr-view-ZSR-8m-2da”。

这是因为我试图在视图控制器的 init (withCoder)中向 self. view 添加一个 subview。Self. view 还不存在。

移动到 viewDidLoad 和所有更好!

在 Objective-C 视图控制器中使用自定义的 Swift 视图(是的,即使在导入 <<PROJECT NAME>>-Swift.h文件之后) ,我尝试使用以下方法加载笔尖:

MyCustomView *customView = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([MyCustomView class]) owner:self options:nil] objectAtIndex:0];

... 但是 NSStringFromClass([MyCustomView class])返回 <<PROJECT NAME>>.MyCustomView,加载失败。 TL; DR 所有工作都很好地使用字符串文字加载笔尖:

MyCustomView *customView = [[[NSBundle mainBundle] loadNibNamed:@"MyCustomView" owner:self options:nil] objectAtIndex:0];

您的 XIB 文件可能位于项目文件夹之外。这导致没有显示目标检查员。但是,将 XIB 文件移动到项目文件夹中应该可以修复它。

在填写 XIB 名称时不要填入. XIB! 这已经暗示了!

不要这样做:

 UIView *viewFromNib = [[NSBundle mainBundle] loadNibNamed:@"ResultsAssessmentView.xib" owner:self options:nil][0];

这样做:

 UIView *viewFromNib = [[NSBundle mainBundle] loadNibNamed:@"ResultsAssessmentView" owner:self options:nil][0];

我有同样的问题,我的 .xib文件已经在 Target Membership与项目链接。然后,我取消选中文件的目标复选框,并再次选中,然后 CleanBuild的项目。有趣的是,这对我很有效。

注意: Xcode 对文件名是大小写敏感的,它的“有趣”和“有趣”是不一样的。

例如,如果您的 MyCustomView.swiftMyCustomView.xib在一个框架中。 把这个放在 MyCustomView的初始值中:

let bundle = Bundle(for: type(of: self))
let nib = UINib(nibName: "MyCustomView", bundle: bundle)
if let nibView = nib.instantiate(withOwner: self, options: nil).first as? UIView {
self.aViewInMyCustomView = nibView
self.aViewInMyCustomView.frame = self.frame
self.addSubview(self.aViewInMyCustomView)
// set constraints
self.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint(item: self.aViewInMyCustomView, attribute: .leading, relatedBy: .equal, toItem: self, attribute: .leading, multiplier: 1.0, constant: 0).isActive = true
NSLayoutConstraint(item: self.aViewInMyCustomView, attribute: .trailing, relatedBy: .equal, toItem: self, attribute: .trailing, multiplier: 1.0, constant: 0).isActive = true
NSLayoutConstraint(item: self.aViewInMyCustomView, attribute: .top, relatedBy: .equal, toItem: self, attribute: .top, multiplier: 1.0, constant: 0).isActive = true
NSLayoutConstraint(item: self.aViewInMyCustomView, attribute: .bottom, relatedBy: .equal, toItem: self, attribute: .bottom, multiplier: 1.0, constant: 0).isActive = true
}

为了故事板

我尝试了每一个单一的解决方案张贴在这里,但没有工作为我,因为我使用故事板与 Swift 5。

刚开始在故事板测试应用程序中构建新的控制器和视图,我发现我错过了我的视图控制器的故事板 ID。

这是我的解决方案,如果你想从 ViewController A-> View Controller B 开始

步骤1. 在故事板中: 只要确保 ViewControllerA 嵌入在导航控制器中

步骤2. 在情节串连板中: 现在检查 你有没有提到你的 ViewControllerB 的故事板 ID,您将在代码中使用它作为标识符。

enter image description here

步骤3. ,最后确保通过单击按钮在 ViewControllerA 中以这种方式推动控制器。

if let viewControllerB = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewControllerB") as? ViewControllerB {


if let navigator = navigationController {
navigator.pushViewController(viewControllerB, animated: true)
}
}

对我来说,它解决了只是改变了名称,我的细胞的文件到相同的类。

在属性检查器(故事板右边栏第三个标签) :

  1. 设置单元格的标识符(例如: “ MyCellId”) ,
  2. 设置单元格的 Class (例如: “ MyCellClass”,当文件为“ MyCellClass”时) ,
  3. 在视图控制器中注册单元格,如下所示:

    Register (UINib (nibName: “ MyCellClass”,bundle: nil) ,forCellReuseIdentifier: “ MyCellId”)

对于我来说,情况是我在主包中搜索不在主包中的笔尖。我的 nib 位于一个导入的模块中,因此我需要检索该模块的 bundle 并使用它初始化 UINib,而不是使用 Bundle.main

在我的例子中,我用 Cocoapods 创建了一个框架,问题是这样一行:

s.static_framework = true

在我的 framework.podspec文件里

在评论了这一行之后,访问故事板或 XIBs 的所有问题都消失了。

在我的例子中,XIB 的拼写是不正确的。 请确保拼写正确。 LoadNibName (“ XIB _ Name”,拥有者: self,选项: nil)