NSInternalInconsistencyException», причина: «Не удалось загрузить NIB в комплекте: «NSBundle

В моем 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;
}

заранее спасибо


person Adriana Carelli    schedule 04.10.2012    source источник
comment
Попробуйте очистить проект от Product-> Clean. Работал на меня.   -  person uniruddh    schedule 06.08.2014
comment
Повторный запуск проекта сработал для меня,   -  person iYoung    schedule 25.11.2014
comment
У меня была функция принудительного выбора языка, поэтому я изменил комплект. после смены языка я мог загружать локализованные строки и файлы HTML. Но для пользовательского файла xib я столкнулся с этой проблемой (не удалось загрузить NIB в комплекте). Пожалуйста, посоветуйте, что я пропустил?   -  person Suresh Durishetti    schedule 22.12.2017
comment
для раскадровки это то, что сработало для меня stackoverflow.com/a/56199366/1371853   -  person swiftBoy    schedule 18.05.2019
comment
Уборка и строительство помогли мне, спасибо!   -  person Ethan Zhao    schedule 05.06.2020


Ответы (20)


Эта ошибка может возникнуть при переименовании файлов вне XCode. Чтобы решить эту проблему, вы можете просто удалить файлы из своего проекта (щелкните правой кнопкой мыши — «Удалить» и «Удалить ссылку»).

Затем после этого вы можете повторно импортировать файлы в свой проект, и все будет в порядке.

person Daniel C.    schedule 18.12.2012
comment
Для меня рассматриваемых файлов больше не было в проекте. По сути, я последовал этому совету, скопировав их обратно. Однако затем он выдал ошибки соответствия кодировки ключей. Я удалил каждую розетку из повторно добавленных представлений, и вуаля, все заработало. - person public static void; 24.06.2014
comment
Это происходит, даже если вы ПЕРЕИМЕНОВАЕТЕ ВНУТРИ Xcode. Xcode 5.x действительно мерзок. - person Adam; 30.06.2014
comment
Это случилось со мной на днях, когда я получил NSInternalInconsistencyException и не смог загрузить NIB в ошибке пакета. Я смог обойти это, только следуя совету Дэниела С. удалить ссылку, а затем вернуть ее. - person Daniel Zhang; 16.09.2015
comment
Не работает для меня. Я пытаюсь реструктурировать свои коды. В этом нет никакого смысла, я даже не смог найти, где было упомянуто старое расположение файлов, а он никак не может их найти. - person Minsheng Liu; 20.09.2015
comment
Ахах, я забыл то самое ограничение на имя файла… - person Minsheng Liu; 20.09.2015

Просто попробуйте удалить ".xib" из имени пера в "initWithNibName:". Согласно документации предполагается, что «.xib» не должен использоваться.

person paiego    schedule 15.03.2013

Ну, я думаю, что ошибка говорит о том, что он не может найти файл пера с именем «RootViewController» в вашем проекте.

Вы пишете эти строки кода,

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

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

В то же время вы просите его загрузить файл пера с именем «RootviewController»..!! Где это находится..? У вас есть xib-файл с именем «Rootviewcontroller»..?

person akshaynhegde    schedule 04.10.2012
comment
Да, у меня есть файл пера с именем RootViewController. - person Adriana Carelli; 04.10.2012
comment
k.. так ваш файл пера включен в структуру проекта..?? Я имею в виду, это видно в навигаторе проекта? Если это так, попробуйте удалить его (используйте «удалить только ссылки» при удалении) и снова перетащите его в xcode из средства поиска. очистить и построить его. - person akshaynhegde; 04.10.2012
comment
и еще одна вещь, убедитесь, что ваш файл пера присутствует в ресурсах пакета копирования на этапах сборки. - person akshaynhegde; 04.10.2012
comment
Ну, еще одна вещь, просто дважды проверьте написание имени файла пера.. потому что иногда это самая простая вещь, которую v пересматривает..:p - person akshaynhegde; 04.10.2012
comment
Вам не нужно указывать расширение .xib. Если вы это сделаете, это не будет найдено - person jcpennypincher; 21.04.2015
comment
Обычно я получаю эту ошибку, когда NIB находится в структуре проекта, но я забываю добавить его в цель. - person Hahnemann; 15.05.2016

Я проходил через одну и ту же проблему довольно много раз. Что я обнаружил для себя, так это то, что файл xib, на который я ссылаюсь, всегда будет написан с ошибками. В моем случае это строка кода для меня, которая приводит к исключению:

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

«Шельфовая ячейка» была моим именем файла xib. Но я неправильно написал это как «ShelfCell», «shelfCell» и т. д., что привело к исключению. Так что сильно не забивайте себе голову. Проверьте строки кода и написание. Спасибо

person Reeshna    schedule 01.08.2013
comment
Это помогло мне с моей проблемой. В моем случае в Swift я пытался сослаться на nibName и идентификатор повторного использования, используя один и тот же статический идентификатор, и у меня был неправильно введен идентификатор повторного использования. - person David M; 18.03.2015
comment
Это был, к сожалению, мой случай. Спасибо за помощь! - person kinezu; 07.04.2015

Для меня,

Я не устанавливал этот наконечник в требуемую цель.

Шаг 1. Нажмите на свой наконечник в Навигаторе проекта (т. е. на первой левой вкладке).

Шаг 2. Перейдите в Инспектор файлов (т. е. на первой правой вкладке)

Шаг 3. Перейдите в раздел Целевое членство и отметьте цель, в которой вы хотите использовать свой наконечник.

person Mohammad Zaid Pathan    schedule 30.09.2015
comment
Решена проблема с вылетом приложения. - person suhas; 23.08.2018

У меня есть несколько подпроектов.

Я решил эту проблему, добавив файл xib в фазу сборки Copy Bundle Resources проекта main.

person kaspartus    schedule 05.06.2014

Это также может произойти, если вы измените имя вашего xib-файла и забудете изменить все места, на которые он ссылается.

Пример: MainWindow.xib — это TabBarController, который содержит пользовательский ViewController с именем FirstViewController со связанным xib-файлом FirstView. Вы меняете имя на SecondViewController и связанный xib-файл на SecondView.

Решение:

Откройте MainWindow.xib (содержащий TabBarController):

  • Выберите вкладку для ViewController, который вы изменили.
  • В инспекторе удостоверений измените имя пользовательского класса на SecondViewController.
  • В инспекторе атрибутов измените имя xib на SecondView.

Откройте SecondView.xib (это было скопировано из FirstView.xib):

  • В Identity Inspector измените пользовательский класс на SecondViewController.

По желанию вам может понадобиться:

  • Щелкните правой кнопкой мыши SecondView.xib, убедитесь, что «Идентификация и тип-> Целевое членство» включено.
  • Убедитесь, что «Фазы сборки -> Копировать ресурсы пакета» показывает ваш SecondView.xib
  • Я также обнаружил, что иногда мне нужно собрать чистое и удалить приложение из симулятора, чтобы файл xib действительно обновлялся. Симулятор имеет внутренний кеш для файлов xib, который немного противоречив.
person arinmorf    schedule 25.01.2014

Есть так много причин для этой ошибки. Я также получил одну и решил ее.

Возможно, вы добавляете стороннюю структуру и не включаете ее в ресурсы копирования пакета. Это решило проблему для меня.

Сделайте это следующим образом. Перейдите в Target -> BuildPhases -> CopyBundleResources -> Перетащите свою структуру и запустите код.

person Imran    schedule 06.08.2013

Я переименовал xib и столкнулся с этой проблемой, решение для меня состояло в том, чтобы отредактировать главное окно.xib вручную и изменить оскорбительный текст

поиск оскорбительного имени xib в соответствующем xib (просмотреть как исходный код)

измененный

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

с участием

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

и это сработало

person gheese    schedule 23.10.2013

Также убедитесь, что XIB-файл включен в вашу цель. Проверьте файловый инспектор, когда выбран XIB-файл (первая вкладка справа, посередине есть раздел «целевое членство». Цель, для которой вы создаете, должна быть проверена, иначе XIB-файл не будет включен.

person Steven Delrue    schedule 07.05.2015

Я устанавливал необязательный self.collectionView?.backgroundColor в init(coder: конструктор моей коллекции vc.

Как только я переместил эту настройку в viewDidLoad, исключение каким-то образом исчезло. загадочный.

person Anton Tropashko    schedule 14.09.2017

Я трачу час на то, чтобы выяснить, что не так. Но Clean Project сделал свое дело.

Build -> Clean All

Принятое решение, вероятно, тоже работает ... но мне этого было достаточно.

person Mitchell    schedule 30.05.2018

Вы можете проверить, что файл xib имеет то же имя, что и ваш класс файлов. XCode по умолчанию получит имя файла xib из класса файла имени, поэтому, если их имена различаются, XCode не может обнаружить из раскадровки. Это работает со мной.

person Lê Tấn Thành    schedule 06.10.2019

введите здесь описание изображения

В инспекторе удостоверений измените имя класса на соответствующий идентификатор, а также в инспекторе атрибутов измените идентификатор, после чего он должен работать должным образом.

person profiile_samir    schedule 20.02.2020

При разработке приложения для iOS я тоже сталкиваюсь с подобной проблемой. У меня работает простой перезапуск xcode. Надеюсь, это поможет кому-то.

person kttailor4u    schedule 11.08.2013

Я пробовал несколько вещей, и, наконец, мне удалось удалить (и переместить в корзину) рассматриваемый файл .xib. Затем создайте его заново. Чтобы упростить задачу, я временно скопировал материал из .xib в другой .xib, а затем скопировал его обратно во вновь созданный.

person abc123    schedule 14.10.2013

Я сталкивался с этой ошибкой много раз, также исследовал, почему эта ошибка возникает, и, наконец, я поймал эту ошибку, эту глупую ошибку, которая возникает, когда мы неправильно написали .xib имя файла.

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

В этот момент я неправильно написал TableViewCell как TabelViewCell , потому что восприятие некоторое время мы читаем это как правильное, это самая распространенная проблема. Просто скопируйте имя файла .xib и вставьте его.

person Rahul Panzade    schedule 30.08.2017

Я получал эту ошибку, когда пытался добавить жестRecognizer в представление моего ViewController, и целью было представление, а не само себя:

Вместо:

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

Исправлено:

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

И ошибка исчезла.

person sabius    schedule 26.11.2018

Обратите внимание, что если вы используете [self class] nibName], вы можете вернуть другое имя, если вы используете swift... может отличаться от имени, которое вы ожидаете вернуть.

Особенно, если у вас есть несколько целей для вашего кода.

В этом случае попробуйте переопределить:

override var nibName: String?{
        return "YourXibFileName" // No .xib at the end :)
}
person R.Kito    schedule 01.05.2019

В моем случае это произошло из-за того, что я удалил свойство Main.storyboard и вообще свойство вкладки Main Interface очистил и добавил пользовательское свойство как Start. После того, как я изменил Main Interface на Start.storyboard, кроме Start, он работает.

person Blasanka    schedule 30.10.2019