NSInternalInconsistencyException,原因:无法在包中加载NIB。

16

我浏览了很多关于这个问题的答案,但似乎都与我的问题无关。

我有两个视图,视图1有一个按钮,视图2也有一个按钮。

视图1的按钮绑定了一个模型segue到视图2。

我点击视图1中的按钮,它会打开视图2。

在视图2中,该按钮连接到一个IBAction,它会触发

[self dismissViewControllerAnimated:YES completion:nil];

点击该按钮将关闭当前视图并重新显示视图1 - 如果我再次在视图1上按下按钮,我会得到

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle <x/y/z/SomeApp.app> (loaded)' with name 'tvz-Io-ndz-view-rB8-bq-l6j' and directory 'Main.storyboardc''

我完全不知道如何解决这个问题,请帮忙!

编辑:

  • 只有在设备没有连接互联网时才会出现这个问题。
  • 如果我有一个带有 webview 渲染图像的第三个屏幕,在从视图 2 转到该屏幕时,应用程序不会崩溃。

编辑 2:

我也试过从头开始重建屏幕。

我完全摸不着头脑。

编辑 3:完整的堆栈跟踪

2015-01-19 09:10:58.528 SomeApp[37747:2203364] *** Terminating app due to
 uncaught exception 'NSInternalInconsistencyException', reason: 'Could not 
load NIB in bundle: 'NSBundle     
</Users/user/Library/Developer/CoreSimulator/Devices/D23C1B7C-7330-
466E-8369-762C6727B19C/data/Containers/Bundle/Application/AE67C3D3-C5AE-
4A66-91EC-54D976A4A4FC/SomeApp.app> (loaded)' with name 'tvz-Io-ndz-view-
rB8-bq-l6j' and directory 'Main.storyboardc''

*** First throw call stack:
(
    0   CoreFoundation                      0x01f64946 __exceptionPreprocess + 182
    1   libobjc.A.dylib                     0x01beda97 objc_exception_throw + 44
    2   CoreFoundation                      0x01f6486d +[NSException raise:format:] + 141
    3   UIKit                               0x008f8e06 -[UINib instantiateWithOwner:options:] + 1003
    4   UIKit                               0x0071b624 -[UIViewController _loadViewFromNibNamed:bundle:] + 270
    5   UIKit                               0x0071bdbb -[UIViewController loadView] + 295
    6   UIKit                               0x0071bfef -[UIViewController loadViewIfRequired] + 78
    7   UIKit                               0x0071c595 -[UIViewController view] + 35
    8   UIKit                               0x00d8f707 -[_UIFullscreenPresentationController _setPresentedViewController:] + 75
    9   UIKit                               0x006f1a81 -[UIPresentationController initWithPresentedViewController:presentingViewController:] + 113
    10  UIKit                               0x00729a61 -[UIViewController _presentViewController:withAnimationController:completion:] + 2102
    11  UIKit                               0x0072c5d2 __62-[UIViewController presentViewController:animated:completion:]_block_invoke + 345
    12  UIKit                               0x0072c424 -[UIViewController presentViewController:animated:completion:] + 224
    13  UIKit                               0x0072c8ea -[UIViewController presentModalViewController:animated:] + 57
    14  UIKit                               0x00bf448d -[UIStoryboardModalSegue perform] + 271
    15  UIKit                               0x00be1b49 -[UIStoryboardSegueTemplate _perform:] + 217
    16  UIKit                               0x00be1bc5 -[UIStoryboardSegueTemplate perform:] + 116
    17  UIKit                               0x006d4907 -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 1490
    18  UIKit                               0x006d4af7 -[UITableView _userSelectRowAtPendingSelectionIndexPath:] + 285
    19  UIKit                               0x006d9df3 __38-[UITableView touchesEnded:withEvent:]_block_invoke + 43
    20  UIKit                               0x005ee0ce ___afterCACommitHandler_block_invoke + 15
    21  UIKit                               0x005ee079 _applyBlockToCFArrayCopiedToStack + 415
    22  UIKit                               0x005ede8e _afterCACommitHandler + 545
    23  CoreFoundation                      0x01e879de __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 30
    24  CoreFoundation                      0x01e87920 __CFRunLoopDoObservers + 400
    25  CoreFoundation                      0x01e7d35a __CFRunLoopRun + 1226
    26  CoreFoundation                      0x01e7cbcb CFRunLoopRunSpecific + 443
    27  CoreFoundation                      0x01e7c9fb CFRunLoopRunInMode + 123
    28  GraphicsServices                    0x043d524f GSEventRunModal + 192
    29  GraphicsServices                    0x043d508c GSEventRun + 104
    30  UIKit                               0x005c48b6 UIApplicationMain + 1526
    31  SomeApp                             0x000e482d main + 141
    32  libdyld.dylib                       0x027e8ac9 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

詹姆斯


@Stonz2 没有手写代码,只需右键拖动按钮到第二个视图,并且没有额外的 Segue 处理代码。 - TheBritishAreComing
你的 'teardown' 代码中缺少某些内容,导致view2中有一些进程已被启动但未进行妥善清理。也许view2是某个委托的代表,导致了保留循环?从我的经验来看,只有在第一个view2没有被正确释放时才会发生这种情况。 - Jef
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Jef
我的第一个猜测是,在你运行的任何网络代码中,你没有考虑到这种情况。 (哎呀,你没有运行任何代码?)广告?分析?一些第三方代码/库? - Jef
@James 为什么“Main.storyboard”显示为“Main.storyboardc”?为什么末尾多了一个字母c? - Rupesh
显示剩余8条评论
8个回答

38

你收到的错误可能有很多原因。

下面我会列出一些需要检查和解决的事项:

  1. 你是否在 Xcode 以外重命名了 xib 或 storyboard 文件? 如果是,请检查所有引用它的地方是否存在不一致。同时,请确保你在任何引用该文件的地方都遵守大小写敏感,因为是区分大小写的。

  2. 进入 Interface Builder,选择你的 View1 ViewController > Utilities 面板 > Identity Inspector > 检查 Custom Class 是否对应于你的 ViewController 类(如果有 .h 和 .m 文件)。

  3. 检查你的 Info.plist 文件。如果你使用 storyboads,则应该有一个类似于 Main storyboard file base name 而不是 Main nib file base name 的条目。如果你使用 nibs,则相反。同时,检查文件基本名称是否与实际文件名称相对应。

  4. 检查你的目标的 Build Phases > Copy Bundle Resources,确保你的 xib 或 storyboard 文件已添加到其中。

  5. 如果你通过编程方式实例化 View1 ViewController 并使用 xib 文件,则检查拼写错误(请记住,它区分大小写)。

    同时,如果你当前将 .xib 文件格式附加到名称中,请删除扩展名,因为它不应该使用。我的意思是这一行代码:UIViewController *controller = [[UIViewController alloc] initWithNibName:@"xibFileName" bundle:nil];

  6. 检查文件检查器中你的 xib 或 storyboard 文件的属性,并确保你的文件在 Target Membership 选择面板中链接到目标。

  7. 检查文件检查器中 xib 或 storyboard 文件的属性,并尝试将文件 Location 切换到 Relative to projectRelative to group。看看是否有任何差异。

  • 如果您在 initWithCoder 方法中以编程方式添加视图控制器,则应该改为在 viewDidLoad 方法中实例化它。

  • 如果以上都不适用于您的情况,您可以从Xcode中删除文件(选择Remove References)并将其重新导入到您的项目中。

  • 记得在进行以上更改后始终清理项目(SHIFT+COMMAND+K)。

    请告诉我们是否奏效以及哪些内容奏效了。


    这是一个非常棒的理由列表。不确定你是如何想出来的...但是非常感谢!以上的第6条就是我们的原因。=) - Marchy
    我的问题是我没有使用正确的bundle... bundle: Bundle(for: - devjme

    2
    我尝试了上述所有答案,但都没有生效。对我而言,解决方案是将xib包含在目标资源中。
    执行步骤如下:
    - 点击xib文件。 - 打开Identity Inspector -> Target Membership,并勾选第二个选项(ProjectName_Resource)。

    1

    访问 xib 之前,您可能需要为类设置 bundle:

    ObjectiveC:

    //Bundle initialisation
    NSBundle* bundle = [NSBundle bundleForClass:[self class]];
    
    //Initialising the nib
    UIView *nibView = [[bundle loadNibNamed:@"nibFileName" owner:self options:nil] objectAtIndex:0];
    
    //Display the ad (this will vary based on your application setup)
    [[[UIApplication sharedApplication] keyWindow] addSubview:nibView];
    

    1

    当我从zip文件中提取一个.app并尝试在iOS设备和模拟器上运行时,我遇到了这个问题。

    一个.nib文件被命名为非拉丁字符(fileNormal.nib带有希腊字母No),当它从zip中提取时,它被分配到另一个字符集的字母上(应该是Greek-DOS或兼容的字符集)。我选择了一个不同的字符集进行提取,然后它就正常工作了。

    只是为了提醒其他人如果遇到同样的问题;)


    0

    还有可能在所需的UIViewController中没有实现UITableViewDataSource或UITableViewDelegate


    0
    在我的情况下,完全相同的异常是由于两个控制器具有相同的故事板ID(在一个故事板中)引起的。

    0

    您可以尝试并检查以下异常情况:

    1)如果nib文件丢失,请在Xcode中添加相同的文件

    2)在关闭之前,在IBAction方法中进行检查,请参考this


    0

    如果您正在使用cocoapods,运行pod update可能会有所帮助。我的其中一个团队成员更改了一个 pod,导致了该错误,因此通过pod update来解决它。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接