'NSInternalInconsistencyException', причина: '- [UIViewController _loadViewFromNibNamed: bundle:] загрузил перо GameView, но выход представления не был установлен - PullRequest
11 голосов
/ 28 марта 2011

Это не та же самая ситуация, что и множество других подобных вопросов здесь.

* Завершение работы приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: '- [UIViewController _loadViewFromNibNamed: bundle:] загрузил перо GameView, но выход представления не был установлен.'

Возможно, вы думаете: «делайте, как говорится, подключите владельца файла к представлению в IB!».Но дело в том, что у меня даже нет GameView.xib в моем проекте или даже в каталоге проекта.

У меня есть «GameViewController.m» и соответствующий «GameViewController.xib» в моем проекте.Использование этого GameViewController - вот что вызывает эту ошибку, но я не понимаю, откуда взялась идея попробовать загрузить GameView.xib.Не следует ли использовать вместо него «GameViewController.xib»?


Если я выполняю grep моего каталога проекта, я вижу, что он ссылается на «UserInterfaceState.xcuserstate».

<string>file://localhost/Users/bemmu/Dropbox/b2/iphone/ValleyStory/ValleyStory/GameView.xib</string>

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

Удалось ли перепутать xcode?

Ответы [ 12 ]

19 голосов
/ 15 мая 2012

Мое решение было немного другим.

  1. Нажмите на xib в конструкторе интерфейса
  2. Выберите владельца файла слева
  3. Откройте инспектор соединений владельца файла
  4. Если свойство представленияеще не подключен, перетащите его на значок просмотра (под значками владельца файла и первого респондента).
5 голосов
/ 03 июня 2014

У меня тоже была эта проблема, но пришлось решить ее по-другому. По сути, у меня есть имя контроллера представления MainViewController, в котором есть xib с именем MainViewController.xib. У этого пера свойство view установлено на владельца файла, который был MainViewController.

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

Таким образом, я хотел, чтобы MainViewController.xib загружался в качестве кончика для объекта MainViewController, а внутри MainViewController, в какой-то более поздний момент, я бы добавил внутреннее представление, указанное в MainView.xib.

Возникла пара проблем:

1.) В документах Apple я обнаружил, что при загрузке контроллера представления через раскадровку или перо:

"Если имя класса контроллера представления заканчивается словом« Controller », то как в MyViewController он ищет файл пера, имя которого соответствует имя класса без слова «Controller», как в MyView.nib.

Ищет файл пера, имя которого совпадает с именем представления. Контроллер класса. Например, если имя класса MyViewController, он ищет файл MyViewController.nib. "

Следовательно, вы не можете иметь перо MainView.xib, если у вас также есть перо MainViewController и хотите, чтобы MainViewController.xib был основным пером для MainViewController.

2.) Даже если вы удалите MainView.xib или переименуете его в что-то другое (в данном случае MainInternalView.xib), вы ДОЛЖНЫ удалить / очистить симулятор iOS, поскольку старый файл пера (MainView.xib) все равно останется в приложение. Он не перезаписывает весь пакет приложения, когда вы перестраиваете / перезапускаете свое приложение.

Если вы не хотите сбрасывать настройки содержимого (возможно, у вас есть данные, которые вы хотите сохранить), щелкните правой кнопкой мыши свое приложение в папке iOS Simulator, выберите «Показать содержимое пакета», найдите MainView.nib и удалите. Это. Xcode НЕ будет делать это автоматически для вас, когда вы перестраиваете, поэтому нам нужно вручную удалить старый кончик.

В целом, не делайте перья с именами MainViewController и MainView, то есть перья с одинаковым префиксом. Вызовите MainView.xib как-нибудь еще, например MainInternalView.xib.

5 голосов
/ 28 марта 2011

Проверьте все файлы пера, которые вы используете (например, MainWindow.xib).Если вы загружаете GameViewController из пера, проверьте файл, из которого он загружается (на вкладке информации в инспекторе).Убедитесь, что установлено «GameViewController», а не «GameView».

2 голосов
/ 17 марта 2013

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

  1. Выйти из Xcode
  2. Перейдите к UserInterfaceState.xcuserstate, расположенному в .xcodeproj/project.xcworkspace/xcuserdata/<username>.xcuserdata и удалите файл.
  3. Снова откройте Xcode.Xcode создаст новый UserInterfaceState.xcuserstate, который будет чистым.
1 голос
/ 20 октября 2013

В моем случае я вообще не использовал xib.Мне нужно было удалить файл .m из Фазы сборки> Исходники компиляции и добавить его обратно.

0 голосов
/ 11 января 2017

В моем случае эта ошибка была вызвана тупой ошибкой - я удаляю _view view dumb mistake

0 голосов
/ 17 ноября 2013

У меня была эта проблема, потому что я делал что-то плохое в

  • (id) initWithCoder: (NSCoder *) кодер

, который загружает NIB.

0 голосов
/ 15 июля 2013

UIViewController ищет nib с тем же именем, что и контроллер, когда передается nil в initWithNibNamed:bundle: Проверьте, что имя файла, которое вы передаете инициализатору, является правильным и существует!

Например: (например, [[CCVisitorsController alloc] initWithNibName:nil bundle:nil], тогда UIViewController пытается загрузить перо с именем CCVisitorsController по умолчанию.

Если этот файл не существует, то вы упомянули ошибку, которую вы упомянули.

0 голосов
/ 05 ноября 2012

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

0 голосов
/ 17 июня 2012

У меня было несколько представлений, и случайно (я не знаю, как это произошло), но у моего фонового представления не было владельца файла, поэтому для всех, у кого есть эта проблема в будущем, убедитесь, что все ваши представления есть владелец файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...