无法在捆绑中加载NIB

时间:2011-03-17 09:44:25

标签: ios iphone xcode titanium appcelerator

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

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

  

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

为什么会出现此错误?

34 个答案:

答案 0 :(得分:189)

访问文件检查器中的.xib文件属性,选择框中的“目标成员资格”属性,然后您的xib文件与目标链接

答案 1 :(得分:40)

Targets -> Build Phases

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

答案 2 :(得分:22)

尝试找出所有

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

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

答案 3 :(得分:15)

在将我的xcode从3.2升级到4.02之后,我遇到了同样的问题(异常'无法在bundle中加载NIB:..')。虽然使用Xcode 3.2部署我的应用程序工作正常但它会导致xcode 4崩溃,从而引发上述异常 - 但仅当我尝试部署到IOS模拟器(v.4.2)时。针对IOS设备(v.4.1)的目标也是Xcode 4。

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

访问文件检查器中的.xib文件的属性: 所有.xib文件的属性“Location”都设置为“Relative to Group”。 我将其更改为“相对于项目”并且瞧:所有.xib文件现在都是正确的 加载到IOS模拟器中!

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

答案 4 :(得分:12)

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

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

答案 5 :(得分:8)

错误表示没有名称为"JRProvidersController"的.xib文件。 重新检查JRProvidersController.xib是否存在。

您将使用

加载.xib file
controller = [[JRProvidersController alloc] initWithNibName:@"JRProvidersController" bundle:nil];

答案 6 :(得分:6)

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

答案 7 :(得分:6)

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

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

答案 8 :(得分:5)

我在故事板上遇到了这个问题,笔尖被称为&#39; bKD-J3-fhr-view-ZSR-8m-2da&#39;。

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

将其移至viewDidLoad并且更好!

答案 9 :(得分:4)

看看项目

Target -> Buid Phases -> Copy Bundle Resources

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

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

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

只需清理并构建项目。

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

答案 10 :(得分:2)

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

答案 11 :(得分:2)

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

答案 12 :(得分:2)

如果同样的问题没有任何效果,那么我认为派生数据很奇怪。

在xcode 6.3.2中,我不得不:

在XCode菜单中 - &gt;偏好 - &gt;地点标签 - &gt;在位置中将派生数据更改为相对,然后切换回默认

然后笔尖装好了。

答案 13 :(得分:2)

我使用Xcode 6.3获得了一次有趣的体验。

我仍然不断收到此错误,尽管尝试了上面建议的拼写,目标会员等通常会想到的一切。我也尝试过清理,删除派生数据,还要多次从模拟器中删除应用程序,以确保捆绑包正确构建但无济于事。

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

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

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

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

答案 14 :(得分:2)

Swift4示例,如果您的 MyCustomView.swift MyCustomView.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
} 

答案 15 :(得分:2)

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

编辑:使用新的Xcode启动版本4.6.3,如果重命名(使用重构功能)Controller类,它也将重命名nib文件,你不必担心nib加载问题。

答案 16 :(得分:2)

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

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

答案 17 :(得分:2)

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

答案 18 :(得分:1)

用于情节提要

我尝试了这里发布的每个解决方案,但是当我在Swift 5中使用Storyboard时,对我来说什么都不起作用。

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

这是我的解决方案,如果您想从ViewController A-> View Controller B转到

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

第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)
            }
        }

答案 19 :(得分:1)

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

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

答案 20 :(得分:0)

就我而言,XIB的拼写不正确。 请确保拼写正确。 Bundle.main.loadNibName(“ XIB_Name”,所有者:self,选项:nil)

答案 21 :(得分:0)

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

答案 22 :(得分:0)

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

答案 23 :(得分:0)

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

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

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

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

答案 24 :(得分:0)

就我而言,我正在使用Cocoapods创建框架。问题是这一行:

s.static_framework = true

在我的framework.podspec文件中

在评论了这一行之后,访问情节提要或XIB的所有问题全部消失了。

答案 25 :(得分:0)

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

答案 26 :(得分:0)

这对我有用.. 确保正确输入了笔尖名称。

[[NSBundle mainBundle] loadNibNamed:@&#34; Graphview&#34;所有者:自我选择:nil];

Graphview(笔尖名称)

答案 27 :(得分:0)

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

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

答案 28 :(得分:0)

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

答案 29 :(得分:0)

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

答案 30 :(得分:0)

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

答案 31 :(得分:0)

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

答案 32 :(得分:0)

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

我还将一个项目从XCode 3移动到4.2。更改路径类型并不重要。

答案 33 :(得分:0)

在将旧代码从XCode 3x转换为XCode 4和时,遇到此问题 只需将wwwwwwww.xib重命名为RootViewController.xib

即可解决问题