繁体   English   中英

无法加载捆绑包中的 NIB

[英]Could not load NIB in bundle

我正在尝试将 Janrain Engage 作为自定义模块与 Appcelerator Titanium 集成。 我创建了一个示例模块并将 JREngage 文件夹拖到示例模块 xcodeproj 中,如 Jainrain 的文档中所示。

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

由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无法加载捆绑包中的 NIB:”NSBundle </Users/abhilash/Library/Application Support/iPhone Simulator/4.2/Applications/CA167346-4091-4E16-B841-93915131D test.app>(已加载)',名称为'JRProvidersController''

为什么会发生此错误?

在文件检查器中访问 .xib 文件的属性,在选择框中选中“Target Membership”属性,然后您的 xib 文件与您的目标相关联

Targets -> Build Phases

确保将 .xib 添加到Copy Bundle Resources ,如果它不存在,则添加 .xib 文件。

尝试找出所有

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

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

将我的 xcode 从 3.2 升级到 4.02 后,我遇到了同样的问题(异常“无法在包中加载 NIB:..”)。 虽然使用 Xcode 3.2 部署我的应用程序运行良好,但它会在 xcode 4 崩溃时引发上述异常 - 但仅当我尝试部署到 IOS Simulator (v.4.2) 时。 针对 IOS 设备 (v.4.1) 也适用于 Xcode 4。

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

在文件检查器中访问 .xib 文件的属性:对于所有 .xib 文件,属性“位置”被设置为“相对于组”。 我将其更改为“相对于项目”,瞧:所有 .xib 文件现在都已正确加载到 IOS 模拟器中!

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

就我而言,它非常奇怪(使用故事板):出于某种原因,它在 plist 中从“主故事板文件库名称”更改为“主 nib 文件库名称”。

改回“主故事板文件基本名称”(UIMainStoryboardFile)解决了这个问题

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

您将加载.xib file

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

在 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];

有看项目

Target -> Build Phases -> Copy Bundle Resources

你会发现你的 xib/storyborad 是红色的。

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

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

只需清理并构建项目。

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

我的故事板有这个问题,笔尖被称为“bKD-J3-fhr-view-ZSR-8m-2da”。

这是因为我试图在视图控制器的初始化(withCoder)中向 self.view 添加一个子视图。 Self.view 尚不存在。

将它移动到 viewDidLoad 并且一切都更好!

插入 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];

对于故事板

我尝试了这里发布的每一个解决方案,但没有任何对我有用,因为我将 Storyboard 与 Swift 5 一起使用。

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

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

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

第 2 步。在故事板中:现在检查您是否提到了 ViewControllerB 的故事板 ID ,您将在代码中将其用作标识符。

在此处输入图片说明

第 3 步。最后确保您通过单击按钮在 ViewControllerA 中以这种方式推送控制器。

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

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

构建目标是我的 iOS 设备之一,我右键单击产品文件 (xyzw.app) 并选择在 Finder 弹出项中显示。 它打开了一个窗口,里面有 xyzw.app; 我使用 Show Package Contents 打开了包,看到了我期望的所有文件,除了一个文件,它抱怨的那个文件,在名称中用大写的 I 而不是小写的 i(zoomieVIew.nib 而不是 zoomieView.nib )。 我注意到xib的文件名中的大写I,并对其进行了更改和重建; 显然 Xcode 保留了生成的 .nib 名称。 我删除了包中的 zoomieVIew.nib,重新构建,Xcode 将文件重新创建为 zoomieView.nib。 该应用程序开始在设备上运行。

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

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

Swift4 示例,如果您的MyCustomView.swiftMyCustomView.xib在框架中。 把它放在MyCustomView的 init 中:

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
} 

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

您的 XIB 文件可能在您的项目文件夹之外。 这会导致不显示目标检查器。 但是,将 XIB 文件移动到您的项目文件夹应该可以修复它。

小心:Xcode 对文件名区分大小写。 “有趣”与“有趣”不同。

在 Xcode 4.6.3 上工作并本地化我的 NIB 文件时,我也遇到了这个问题。

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

我刚刚在使用 Xcode 6.3 时获得了有趣的体验。

尽管按照上面的建议尝试了您通常会想到的拼写、目标成员资格等,但我也一直收到此错误。 我还多次尝试清理、删除派生数据,并多次从模拟器中删除应用程序,以确保正确构建包,但无济于事。

最后,按照 Brian Michael Bentley 的回答,我终于决定检查我的 HD 模拟器文件夹中的 .app 文件。 我发现我所有的笔尖都在那里,但带有 abc~ipad.nib 而不是预期的 abc.nib。 我手动重命名了所有这些文件以删除 ~ipad 部分,构建并运行!

试图了解为什么这些附加了 ~ipad 关键字,我查看了我的项目设置,事实上,在我的 General>Deployment Info 选项卡中,我只选择了 iPad。 我试图在 iPhone 模拟器上运行。 我相信在过去,Xcode 会给出一个错误,表明二进制文件不支持 iPhone,您将无法成功运行该应用程序。

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

因此,Xcode 方面存在一些不一致的行为,不幸的是这是一个间歇性错误,这可能难以重现,但我将其放在这里,以便将来可以帮助其他人。

有同样的问题没有任何效果,所以我发现派生数据有些奇怪。

在 xcode 6.3.2 中,我必须:

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

然后笔尖加载良好。

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

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

我有同样的问题,我的.xib文件已经在Target Membership与项目相关联。 然后我取消选中文件的目标复选框并再次选中,然后CleanBuild项目。 有趣的是,它对我有用。

对我来说,只需将我的单元格文件的名称更改为与其类相同的名称即可解决。

在属性检查器(故事板右侧栏的第三个选项卡)中:

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

    tableView.register(UINib(nibName: "MyCellClass", bundle: nil), forCellReuseIdentifier: "MyCellId")

我遇到了同样的问题。 就我而言,笔尖名称是“MyViewController.xib”,我将其重命名为“MyView.xib”。 这摆脱了错误。

我还在将一个项目从 XCode 3 转移到 4.2。 更改路径类型无关紧要。

每次我重构 appDelegate 中的视图控制器名称时,我都会在此浪费时间。 重构不会更改 initWithNibName:@"MYOLDViewControllerName" 中的笔尖名称。

我有同样的问题,在故事板中重命名我的视图控制器标识符对我有用。

我注意到如果您在 git 中的分支之间切换而忘记清理,可能会发生这种情况。 所以xib在那里,一切都找到了,但确切的构建可能有问题。 所以以防万一不要忘记做一个清洁

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

在上面的代码中,如果你还给了一个像“SecondView.xib”这样的文件扩展名,那么它是错误的,会给你上面的错误。 改用“SecondView”。 我犯了那个错误。

我正在尝试将Janrain Engage作为自定义模块与Appcelerator Titanium集成。 我已经创建了一个示例模块,并将JREngage文件夹拖到Jainrain文档中指示的示例模块xcodeproj。

现在,我向该项目提供构建命令,然后执行./build.py ,最后执行titanium run命令。 它以空白屏幕在模拟器中启动应用程序,并立即崩溃并引发以下错误。

由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无法在捆绑包中加载NIB:'NSBundle </ Users / abhilash / Library / Application Support / iPhone Simulator / 4.2 / Applications / CA167346-4091-4E16-B841-955D1D391713 /名为'JRProvidersController的test.app>(已加载)''

为什么会发生此错误?

将我的旧代码从 XCode 3x 转换为 XCode 4 时遇到此问题,只需将 wwwwwwww.xib 重命名为 RootViewController.xib 即可解决此问题

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM