NSInternalInconsistencyException',原因:'无法在bundle中加载NIB:'NSBundle

时间:2012-10-04 07:42:12

标签: ios compiler-errors nib appdelegate

在我的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;
}

提前致谢

20 个答案:

答案 0 :(得分:92)

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

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

答案 1 :(得分:18)

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

答案 2 :(得分: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文件..?

答案 3 :(得分:10)

我经历了很多次同样的问题。我为自己找到的是我链接的xib文件总是拼写错误。 就我而言,这是导致异常的代码行:

* NSArray nib = [[NSBundle mainBundle] loadNibNamed:@“shelfcell”所有者:自选:nil];

“shelfcell”是我的xib文件名。但我错误拼写为“ShelfCell”,“shelfCell”等,这导致异常。所以不要误会你的头脑。检查代码行和拼写。谢谢

答案 4 :(得分:9)

我有一些子项目。

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

答案 5 :(得分:8)

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

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

解决方案:

打开MainWindow.xib(包含TabBarController):

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

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

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

您可能需要:

  • 右键单击SecondView.xib,验证是否已启用“身份和类型 - >目标成员身份”。
  • 确保“Build Phases - &gt; Copy Bundle Resources”显示您的SecondView.xib
  • 我还发现我偶尔需要构建干净并从模拟器中删除应用程序以使xib文件实际更新。模拟器有一个用于xib文件的内部缓存,有点不一致。

答案 6 :(得分:7)

对我来说,

我没有在所需目标中安装该笔。

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

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

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

答案 7 :(得分:3)

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

您可能正在添加第三方框架,而不是将其包含在Copy Bundle Resources中。这解决了我的问题。

执行以下操作。转到目标 - &gt; BuildPhases - &gt; CopyBundleResources - &gt;拖放框架并运行代码。

答案 8 :(得分:1)

enter image description here

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

答案 9 :(得分:1)

我花了一个小时才发现出了什么问题。但是Clean Project做了这个伎俩。

Build -> Clean All

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

答案 10 :(得分:1)

我正在设置一个可选的self.collectionView?.backgroundColor init(编码器:我收集的构造函数vc。

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

答案 11 :(得分:1)

还要确保XIB文件包含在目标中。选择XIB文件时检查文件检查器(右边的第一个选项卡,中间有部分&#34;目标成员资格&#34;。必须检查您构建的目标,否则XIB文件赢了&# 39;包括在内。

答案 12 :(得分:1)

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

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

改变

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

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

并且有效

答案 13 :(得分:0)

我在很多时候都遇到过这个错误,也研究了为什么会出现这个错误,最后,我发现了这个错误,这个错误是一个愚蠢的错误,当我们错误拼写.xib文件名时会发生。

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

此时,我将TableViewCell拼错为TabelViewCell,因为有时我们认为它是正确的,这是最常见的问题。 只需复制.xib文件名,然后粘贴即可。

答案 14 :(得分:0)

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

答案 15 :(得分:0)

当我尝试向我的ViewController的视图中添加gestureRecognizer且目标是视图而不是自己时,出现了此错误:

代替:

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

固定为:

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

错误消失了。

答案 16 :(得分:0)

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

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

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

override var nibName: String?{
        return "YourXibFileName" // No .xib at the end :)
}

答案 17 :(得分:0)

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

答案 18 :(得分:0)

在我的情况下,发生这种情况是因为我删除了Main.storyboard,并且清除了常规选项卡的Main Interface属性,并将自定义项添加为Start。在将Main Interface更改为Start.storyboard后,Start可以正常工作了。

答案 19 :(得分:0)

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