无法在捆绑包中加载NIB


111

我正在尝试将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 / test.app>(已加载)'名称为'JRProvidersController'

为什么会发生此错误?

Answers:


213

在文件检查器中访问.xib文件的属性,在选择框上显示属性“ Target Membership”,然后将您的xib文件与目标链接


2
另外,如果您使用的是alloc init,而不是initWithNibName:bunle :,则将获得黑屏。
罗伯特·Childan '04年

想知道为什么绝对未使用的.xib文件必须挂在项目文件文件夹中…
2013年

我想我不小心取消了此复选框,而不是自动布局。为我修复了崩溃问题,谢谢
Yunus Nedim Mehel 2013年

对我来说,所有目标会员资格复选框都显示为灰色...是什么原因?
2016年

64

Targets -> Build Phases

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


为我工作。当您复制/复制xib文件时,通常会发生这种情况。+1
VoidMain

22

尝试找出全部

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

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


这很容易,因为nibname不会自动键入
chings228

1
他的意思是在自动分配之前的类名:P
吉尔·桑德

uiview可以从笔尖加载,但是没有initWithNibName:bundle:方法
Vyachaslav Gerchicov

我们正在谈论viewcontroller
chings228'3

@ chings228 XXXControlloer和XXXController,看不同之处
Zaporozhchenko Oleksandr

15

将我的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行为背后的原因是什么,但是也许值得尝试一下?


这解决了我在编译非常过时的Quartz Composer插件时遇到的崩溃。
彼得·卡扎兹

12

在我的情况下,这很奇怪(使用情节提要):由于某种原因,它在plist中从“主情节提要文件库名”更改为“主笔尖文件库名”。

改回“主故事板文件库名称”(UIMainStoryboardFile)解决了该问题


1
好一个 有同样的问题。谢谢。这解决了。
拉米兹·侯赛因2014年

1
这解决了我的问题!谢谢。我刚刚复制了我的项目,并重命名了所有相关文件。一切正常,但这。现在一切正常!
BeccaP 2014年

11

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

您将加载.xib file

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

1
嘿,哈努曼,我已经检查了文件JRProvidersController.xib是否存在。我也尝试过重命名文件并执行,即使它抛出相同的异常。
Goje87,2011年

尝试将调用更改为initWithNibName:NSStringFromClass([MyViewController class])。还要仔细检查文件名,因为它区分大小写
Hanuman


我已经做出了您建议的更改,但是没有成功。
Goje87 2011年

7

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

6

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


迈克尔在这里说的也是一样。我创建了一个包含自定义UITableViewCell的xib文件。当我打开.app并搜索myCell.xib时,我看到它实际上是myCell.nib。此外,该应用仅在设备上崩溃,并在模拟器上执行时可以正常加载xib文件。重置它有点棘手。至少对我来说。只有当我删除文件,清理目标并将文件复制回时,它才起作用。
尼尔·彭加斯

标记,因为它还显示了一种查找和查看包装内容的简便方法
fotisgpap 2015年

h 我又怎么能再次做到这一点。谢谢
好心人

6

我在情节提要板上遇到了这个问题,笔尖被称为“ bKD-J3-fhr-view-ZSR-8m-2da”。

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

将其移动到viewDidLoad,一切都更好!


5

看项目

Target -> Buid Phases -> Copy Bundle Resources

您会发现红色的xib / storyborad。

只需删除它,也可以从项目中删除所有丢失文件的引用。

现在,将此故事板/ xib文件再次拖动到此 Copy Bundle Resources它仍会显示红色文件,但担心。

只是清理并构建项目。

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


1
这解决了我的问题,因为我得到了两个故事板“ MyStoryboard.storyboard”和“ MyStoryboard〜ipad.storyboad” ...因此,从iPad目标中,我从“复制捆绑资源”中删除了“ MyStoryboard.storyboard”
i89

5

对于情节提要

我尝试了这里发布的每个解决方案,但是当我在Swift 5中使用Storyboard时,对我没有任何帮助。

刚开始在情节提要测试应用程序中构建新的控制器和视图,我发现我丢失了View Controller的情节提要ID。

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

第1步。在情节提要中:只需确保将ViewControllerA嵌入到Navigation Controller中即可

步骤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)
            }
        }

4

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

4

如果您的MyCustomView.swiftMyCustomView.xib在框架中,则为Swift4示例。将其放在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
} 

最后!我在iOS的模块化项目中工作,这就是我想要的。谢谢!
Firda Sahidi

什么是aViewInMyCustomView?
famfamfam

@famfamfam:UIView
norbDEV

tks,现在我知道如何使用
famfamfam

3

我还发现,当我尝试使用诸如@“ MyFile.xib”之类的名称加载XIB时,它失败了。当我只使用@“ MyFile”时,它可以工作-显然总是添加扩展名。但是错误消息只是说它在捆绑包中找不到MyFIle.xib-如果它说MyFile.xib.xib,那将是一个很大的线索。


不必添加扩展名的原因是,在已编译的捆绑软件中,.xib文件也被编译为.nib文件。因此,您的捆绑包中实际上没有MyFile.xib,不要介意双扩展名。
Pieter Jongsma

2

使用Xcode 4.6.3和本地化我的NIB文件时,我也遇到了这个问题。

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


2

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

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


2

使用Xcode 6.3的经历很有趣。

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

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

尝试查看为什么将这些附加了〜ipad关键字后,我查看了项目设置,实际上,在“常规”>“部署信息”选项卡中,我仅选择了iPad。我试图在iPhone模拟器上运行。我相信在过去,Xcode会给出错误消息,指示该二进制文件不支持iPhone,并且您将无法成功运行该应用程序。

我从模拟器中删除了该应用,然后再次执行了相同的操作-再次仅支持iPad。这次,.app为每个预期的故事板包含abc〜iphone.nib和abc〜ipad.nib,并且可以在iPhone模拟器上正常运行。再次-如果我们仅在“部署信息”设置中选择iPad,则它不应在iPhone Simulator上运行。这是一个Xcode错误。

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


2

如果没有发生同样的问题,那么我发现派生数据有些奇怪。

在xcode 6.3.2中,我必须:

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

然后笔尖装好的。


我刚刚删除了“派生数据”文件夹,它起作用了。似乎很困惑,因为我在项目导航中重命名了xib文件。这个很奇怪。
凯尔·戈斯兰

2

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


2

注意:Xcode是区分大小写的文件名。“乐趣”与“乐趣”不同。


我的笔尖的文件名为FormItemCheckBoxCell.nib,类为FormItemCheckboxCell。大写“ Box”的名字花了我45分钟的生命。
SafeFastExpressive

1

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

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

1

对我来说,它只是通过将单元格文件的名称更改为其类的名称来解决。

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

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

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



0

我遇到了同样的问题。在我的情况下,笔尖名称为“ MyViewController.xib”,我将其重命名为“ MyView.xib”。这消除了错误。

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


0

同样,原因可能是当您对本地化感到困惑时,在错误的特定于语言的文件夹中查找了文件。


0

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


0

我遇到了同样的问题,在故事板中重命名了我的视图控制器标识符对我来说很有效。


0

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


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

在上面的代码中,如果您还提供文件扩展名,例如“ SecondView.xib”,那么它是错误的,并且会给您以上错误。请改用“ SecondView”。我犯了那个错误。


0

这对我有用。确保您输入的笔尖名称正确。

[[NSBundle mainBundle] loadNibNamed:@“ Graphview” owner:self选项:无];

Graphview(笔尖名称)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.