55

在我的 AppDelegate 中有一个我不明白的问题。RootViewController 最初称为 ViewController,我更改了它的名称。该应用程序由许多 ViewController 组成,然后我介绍了一个 UINavigationController。为什么会出现这个错误?

  NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle 
  /Users/XXXXXXXXXXXX/Library/Application Support/iPhone simulator/6.0/Applications/
  B7A7D461-1CFE-4B05-AF32-00B65FCFFF49/XXXXXXXXXX.app> (loaded)'with name 
 'RootViewController''

  *** First throw call stack:
  (0x1992012 0x1357e7e 0x1991deb 0x4bafac 0x37fe37 0x380418 0x380648 0x380882 0
  x380b2a  0x397ef5 0x397fdb x398286 0x398381 0x398eab 0x398fc9 0x399055 0x49e3ab 
  0x2ef92d 0x136b6b0 0x1f12fc0 0x1f0733c 0x1f12eaf 0x38e8cd 0x2d71a6 0x2d5cbf 
  0x2d5bd9 0x2d4e34 0x2d4c6e 0x2d5a29 0x2d8922 0x382fec 0x2cfbc4 0x2cfdbf 
  0x2cff55 0x2d8f67 0x2b30 0x29c7b7 0x29cda7 0x29dfab 0x2af315 0x2b024b 0x2a1cf8 
  0x1dbedf9 0x1dbead0 0x1907bf5 0x1907962 0x1938bb6 0x1937f44 0x1937e1b 0x29d7da
  0x29f65c 0x269d 0x25c5) 
  ibc++abi.dylib: terminate called throwing an exception
  (lldb) 

这是 AppDelegate.h 中的代码

  #import <UIKit/UIKit.h>

  @class RootViewController;

  @interface AppDelegate : UIResponder <UIApplicationDelegate>{

       UINavigationController *navigationController;
   }

  @property (strong, nonatomic) UIWindow *window;

  @property (strong, nonatomic) RootViewController *viewController;
  @property (strong, nonatomic) UINavigationController * navigationController;



  @end

这是 AppDelegate.m 的代码

  #import "AppDelegate.h"

  #import "RootViewController.h"



  @implementation AppDelegate

  @synthesize navigationController;
  @synthesize viewController;
  @synthesize window;



  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:    (NSDictionary *)launchOptions
 {
         self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        // Override point for customization after application launch.

         if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
               self.viewController = [[RootViewController alloc]      initWithNibName:@"RootViewController_iPhone.xib" bundle:nil];
   } else {
    self.viewController = [[RootViewController alloc] initWithNibName:@"RootViewController_iPad.xib" bundle:nil];
   }

    RootViewController *rootMenu=[[RootViewController alloc]initWithNibName:@"RootViewController" bundle:nil];

    self.navigationController =[[UINavigationController alloc]initWithRootViewController:rootMenu];

    self.window.rootViewController = self.navigationController;
    [self.window makeKeyAndVisible];
    return YES;
}

提前致谢

4

20 回答 20

128

当您在 XCode 之外重命名文件时,可能会发生此错误。要解决它,您只需从项目中删除文件(右键单击 - 删除和“删除引用”)。

然后在您可以重新导入项目中的文件之后,一切都会好起来的。

于 2012-12-18T10:38:41.710 回答
18

只需尝试从“initWithNibName:”中的 nib 名称中删除“.xib”。根据文档,“.xib”是假定的,不应使用。

于 2013-03-15T20:17:18.430 回答
17

好吧,我认为错误表明它在您的项目中找不到名为“RootViewController”的 nib 文件。

您正在编写这些代码行,

self.viewController = [[RootViewController alloc]      initWithNibName:@"RootViewController_iPhone.xib" bundle:nil];

self.viewController = [[RootViewController alloc] initWithNibName:@"RootViewController_iPad.xib" bundle:nil];

同时你要求它加载一个名为“RootviewController”的 nib 文件..!! 它在哪里..?你有一个名为“Rootviewcontroller”..的xib文件吗?

于 2012-10-04T08:08:46.153 回答
10

我已经多次经历过同样的问题。我自己发现的是,我链接的 xib 文件总是会拼写错误。就我而言,这是导致异常的代码行:

* NSArray nib = [[NSBundle mainBundle] loadNibNamed:@"shelfcell" owner:self options:nil];

“shelfcell”是我的 xib 文件名。但我把它拼错为“ShelfCell”、“shelfCell”等,这导致了异常。所以不要太担心你的头。检查代码行和拼写。谢谢

于 2013-08-01T09:29:53.327 回答
10

为了我,

我没有在所需的目标中安装那个笔尖。

第 1 步:在 Project Navigator 中单击您的笔尖(即在第一个左侧选项卡中)

第 2 步:转到文件检查器(即在第一个右侧选项卡中)

第 3 步:转到 Target 会员资格并勾选您要在其中使用您的笔尖的目标。

于 2015-09-30T05:33:49.957 回答
9

如果您更改了 xib 文件的名称,而您忘记更改所有引用它的位置,也会发生这种情况。

示例:MainWindow.xib 是一个 TabBarController,它包含一个名为 FirstViewController 的自定义 ViewController 以及关联的 xib 文件 FirstView。您将名称更改为 SecondViewController 并将关联的 xib 文件更改为 SecondView。

解决方案:

打开 MainWindow.xib(包含 TabBarController):

  • 选择您更改的 ViewController 的选项卡。
  • 在身份检查器上,将自定义类名称更改为 SecondViewController。
  • 在属性检查器上,将 xib 名称更改为 SecondView。

打开 SecondView.xib(这是从 FirstView.xib 复制的):

  • 在 Identity Inspector 上,将自定义类更改为 SecondViewController。

或者,您可能需要:

  • 右击 SecondView.xib,确认“Identity and Type->Target Membership”已启用。
  • 确保“Build Phases -> Copy Bundle Resources”显示您的 SecondView.xib
  • 我还发现我偶尔需要构建干净并从模拟器中删除应用程序以使 xib 文件实际更新。模拟器有一个有点不一致的 xib 文件的内部缓存。
于 2014-01-25T21:44:41.930 回答
9

我有一些子项目。

我通过将 xib 文件添加到项目的 Copy Bundle Resources 构建阶段解决了这个问题。

于 2014-06-05T07:50:16.953 回答
3

这个错误有很多原因。我也得到了一个并解决了它。

您可能正在添加第三方框架并且未将其包含在 Copy Bundle Resources 中。这为我解决了问题。

执行以下操作。转到 Target -> BuildPhases -> CopyBundleResources -> 拖放您的框架并运行代码。

于 2013-08-06T05:07:20.560 回答
1

我重命名了一个 xib 并遇到了这个问题,我的解决方案是手动编辑主 window.xib 并更改有问题的文本

在相关的 xib 中搜索有问题的 xib 名称(作为源代码查看)

改变了

<viewController nibName="OldNibName" id="116" customClass="SomeViewController">

<viewController nibName="NewNibName" id="116" customClass="SomeViewController">

它奏效了

于 2013-10-23T21:03:51.337 回答
1

还要确保 XIB 文件包含在您的目标中。选择 XIB 文件时检查文件检查器(右侧第一个选项卡,中间有“目标成员资格”部分。必须检查您构建的目标,否则将不包含 XIB 文件。

于 2015-05-07T08:36:33.920 回答
1

我在 init(coder: 我的集合 vc 的构造函数中设置了一个可选的 self.collectionView?.backgroundColor。

一旦我在 viewDidLoad 中移动了该设置,异常就以某种方式消失了。令人费解。

于 2017-09-14T11:02:35.583 回答
1

我花了一个小时找出问题所在。但 Clean Project 成功了。

Build -> Clean All

接受的解决方案可能也有效..但这对我来说已经足够了。

于 2018-05-30T12:26:20.103 回答
1

您可以检查文件 xib 是否与您的文件类同名。默认 XCode 将从名称文件类中获取名称 xib 文件,因此如果它们的名称不同,则 XCode 无法从情节提要中检测到它适用于我

于 2019-10-06T00:32:41.283 回答
1

在此处输入图像描述

在身份检查器中使用相应的标识符更改类名,并且在属性检查器中修改标识符然后它应该按预期工作。

于 2020-02-20T13:30:38.893 回答
0

在开发 ios 应用程序时,我也面临类似的问题。xcode的简单重启对我有用。希望这会对某人有所帮助。

于 2013-08-11T06:45:37.827 回答
0

我尝试了几件事,最后对我有用的是删除(并移至垃圾箱)有问题的 .xib 文件。然后重新创建它。为了方便起见,我将 .xib 中的内容临时复制到另一个 .xib 中,然后将其复制回新创建的文件中。

于 2013-10-14T21:39:31.773 回答
0

我经常遇到这个错误,也研究了为什么会发生这个错误,最后,我发现了这个错误,这个错误是一个愚蠢的错误,当我们拼错.xib文件名时发生。

NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"TableViewCell" owner:self options:nil];

在这一点上,我拼错 TableViewCell了 as TabelViewCell,因为有些时候我们认为它是正确的,这是最常见的问题。只需复制您的.xib文件名,然后粘贴即可。

于 2017-08-30T09:13:03.430 回答
0

当我尝试将gestureRecognizer添加到我的ViewController的视图并且目标是视图而不是自我时,我遇到了这个错误:

代替:

self.view.addGestureRecognizer(UITapGestureRecognizer(target: self.view, action: #selector(handleTap(_:))))

固定为:

self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleTap(_:))))

并且错误消失了。

于 2018-11-26T18:39:35.217 回答
0

请注意,如果您[self class] nibName]使用 swift,则可以返回不同的名称...可能与您期望它返回的名称不同。

特别是如果您的代码有多个目标。

在这种情况下,尝试覆盖:

override var nibName: String?{
        return "YourXibFileName" // No .xib at the end :)
}
于 2019-05-01T13:35:49.770 回答
0

就我而言,发生这种情况是因为我删除了Main.storyboard并且通常Main Interface清除了选项卡属性并将自定义选项添加为Start. 在我将其更改为之后Main InterfaceStart.storyboardStart正在工作。

于 2019-10-30T14:13:30.983 回答