Не удалось загрузить NIB в связку


111

Я пытаюсь интегрировать Janrain Engage в качестве настраиваемого модуля с Appcelerator Titanium. Я создал образец модуля и перетащил папку JREngage в образец модуля xcodeproj, как указано в документации Jainrain.

Теперь я даю этому проекту команду сборки, затем выполняю ./build.pyи, наконец, выполняю titanium runкоманду. Он запускает приложение в симуляторе с пустым экраном и сразу выдает сбой, вызывая следующую ошибку.

Завершение работы приложения из-за неперехваченного исключения «NSInternalInconsistencyException», причина: «Не удалось загрузить NIB в комплекте:» NSBundle </ Users / abhilash / Library / Application Support / iPhone Simulator / 4.2 / Applications / CA167346-4091-4E16-B841-955D1D391713 / test.app> (загружено) 'с именем' JRProvidersController ''

Почему могла возникнуть эта ошибка?

Ответы:


213

Посетите свойства файлов .xib в инспекторе файлов , свойство «Целевое членство» в поле выбора, затем ваш xib-файл был связан с вашей целью


2
Кроме того, если вы используете alloc init вместо initWithNibName: bunle:, вы получите черный экран.
Роберт Чилдан,

Интересно, почему абсолютно неиспользуемый файл .xib должен висеть в папке с файлами проекта…
Бен

Наверное, я случайно снял этот флажок вместо автоматического раскладки. Исправлен вылет для меня, спасибо
Юнус Недим Мехель

все флажки целевого членства для меня неактивны ... в чем может быть причина?
Стас

64

В Targets -> Build Phases

Убедитесь, что файл .xib добавлен Copy Bundle Resources, если его нет, добавьте файл .xib.


Работал у меня. Обычно это происходит, когда вы копируете / дублируете файл xib. +1
VoidMain

22

попробуй узнать все

XXXController = [[XXXControlloer alloc] initWithNibName:@"XXXController" bundle:nil];

в вашем коде и убедитесь, что XXXControllerони написаны правильно


это легко, так как имя пера не
набирается автоматически

1
Он имел в виду имя класса непосредственно перед выделением, которое набирается автоматически: P
Gil Sand

uiview может быть загружен из nib, но не имеет initWithNibName:bundle:метода
Вячеслав Герчиков

мы говорим о viewcontroller
chings228

@ chings228 XXXControlloer и XXXController, видите разницу
Запорожченко Александр

15

У меня была такая же проблема (исключение «Не удалось загрузить NIB в комплекте: ..») после обновления моего xcode с 3.2 до 4.02. В то время как развертывание моего приложения с Xcode 3.2 работало нормально, оно вылетает из-за того, что xcode 4 вызывает исключение, упомянутое выше, но только тогда, когда я пытался развернуть в симуляторе IOS (v.4.2). Ориентация на устройство IOS (v.4.1) действовала также и с Xcode 4.

Оказалось (после нескольких часов отчаянного рыскания), что причина была в почти «скрытой» настройке в .xib-файле:

Посетите свойства файлов .xib в инспекторе файлов: для свойства «Местоположение» было установлено значение «Относительно группы» для всех файлов .xib. Я изменил его на «Относительно проекта» и вуаля: теперь все файлы .xib правильно загружаются в симуляторе IOS!

Я понятия не имею, в чем причина этого странного поведения Xcode4, но, может быть, стоит попробовать?


Это устранило сбой, с которым я имел дело при компиляции очень устаревшего плагина Quartz Composer.
Питер Казазес

12

В моем случае это было очень странно (используйте раскадровку): по какой-то причине оно изменилось с «Основное имя файла раскадровки» на «Основное имя файла пера» в списке.

Возврат к «Основному имени файла раскадровки» (UIMainStoryboardFile) решил проблему.


1
Хороший. Была такая же проблема. Спасибо. Это решило это.
Рамиз Хуссейн

1
Это решило мою проблему! Спасибо. Я только что продублировал свой проект и переименовал все соответствующие файлы. Все работало, кроме этого. Теперь все работает !!
BeccaP

11

ошибка означает, что нет файла .xib с "JRProvidersController"именем. перепроверьте, JRProvidersController.xibсуществует ли .

вы загрузите .xib fileс

controller = [[JRProvidersController alloc] initWithNibName:@"JRProvidersController" bundle:nil];

1
Привет, Хануман, я проверил, существует ли файл JRProvidersController.xib. Я также попытался переименовать файл и выполнить его, даже если он выдает то же исключение.
Goje87

попробуйте изменить вызов на initWithNibName: NSStringFromClass ([MyViewController class]). Также внимательно проверьте имя файла, так как оно чувствительно к регистру
Хануман


Я внес предложенные вами изменения, но безуспешно.
Goje87

7

Используя настраиваемое представление Swift в контроллере представления Objective-C (да, даже после импорта <<PROJECT NAME>>-Swift.hфайла), я попытался загрузить перо, используя:

MyCustomView *customView = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([MyCustomView class]) owner:self options:nil] objectAtIndex:0];

... но NSStringFromClass([MyCustomView class])возвращается, <<PROJECT NAME>>.MyCustomViewи загрузка не выполняется. TL; DR Все сработало, загрузка пера с использованием строкового литерала:

MyCustomView *customView = [[[NSBundle mainBundle] loadNibNamed:@"MyCustomView" owner:self options:nil] objectAtIndex:0];

6

Поскольку целью сборки является одно из моих устройств iOS, я щелкнул правой кнопкой мыши файл продукта (xyzw.app) и выбрал всплывающий элемент «Показать в Finder». Он открыл окно с xyzw.app внутри; Я открыл пакет с помощью Show Package Contents и увидел все файлы, которые я ожидал, кроме одного файла, на который он жаловался, с заглавной I вместо строчной i в имени (zoomieVIew.nib вместо zoomieView.nib ). Я заметил прописную букву I в имени файла xib, изменил его и перестроил; очевидно, Xcode оставил сгенерированное имя .nib таким, каким оно было. Я удалил zoomieVIew.nib в комплекте, перестроил, и Xcode должным образом воссоздал файл как zoomieView.nib. Приложение начало работать на устройстве.


здесь то же самое, что описывает Майкл. я создал файл xib, содержащий пользовательский UITableViewCell. когда я открываю .app и ищу myCell.xib, я вижу, что на самом деле это myCell.nib. Более того, приложение вылетало только на устройстве и нормально загружало файл xib при выполнении на симуляторе. было немного сложно его сбросить. по крайней мере для меня. только когда я удалил файл, очистил цель и скопировал файл обратно - все заработало.
Нир Пенгас

размечено, так как это также показывает простой способ найти и просмотреть содержимое пакета
fotisgpap

дох. как я мог снова вернуться к этому. спасибо добрый человек :) я был в самом начале исследования этой проблемы
heximal

6

У меня была эта проблема с раскадровкой, и перо называлось что-то вроде 'bKD-J3-fhr-view-ZSR-8m-2da'.

Это произошло потому, что я пытался добавить подпредставление в self.view в init (withCoder) контроллера представления. Self.view еще не существует.

Переместил в viewDidLoad и все стало лучше!


Точно так же я получил такую ​​ошибку, когда (по глупости) попытался назначить делегата представления таблицы и источник данных в init (), а не viewDidLoad ()
jpb

5

Посмотреть на проект

Target -> Buid Phases -> Copy Bundle Resources

Вы найдете свой xib / storyborad красным цветом.

Просто удалите его, а также удалите все ссылки на отсутствующий файл из проекта.

Теперь снова перетащите этот файл раскадровки / xib на это. Copy Bundle ResourcesОн все равно покажет вам файл красного цвета, но не беспокойтесь об этом.

Просто очистите и соберите проект.

Теперь ваш проект снова будет успешно запущен !!


1
Это решило мою проблему, поскольку я получил две раскадровки «MyStoryboard.storyboard» и «MyStoryboard ~ ipad.storyboad» ... поэтому из целевого устройства iPad я удалил «MyStoryboard.storyboard» из «Копировать ресурсы
пакета

5

Для раскадровки

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

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

Итак, вот мое решение, если вы хотите перейти от ViewController A -> View Controller B

Шаг 1. В раскадровке: просто убедитесь, что ваш ViewControllerA встроен в контроллер навигации.

Шаг 2. В раскадровке: теперь проверьте , упомянули ли вы идентификатор раскадровки для своего ViewControllerB, который вы будете использовать в коде в качестве идентификатора.

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

Шаг 3. и, наконец, убедитесь, что вы нажимаете контроллер таким образом в ViewControllerA нажатием кнопки.

if let viewControllerB = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewControllerB") as? ViewControllerB {

            if let navigator = navigationController {
                navigator.pushViewController(viewControllerB, animated: true)
            }
        }

4

НЕ ПОСТАВЛЯЙТЕ .xib, КОГДА ВЫ ВСТАВЛЯЕТЕ В ИМЯ XIB! ЭТО УЖЕ ПОДРАЗУМЕВАЕТСЯ!

Не делай этого:

 UIView *viewFromNib = [[NSBundle mainBundle] loadNibNamed:@"ResultsAssessmentView.xib" owner:self options:nil][0];

Сделай это:

 UIView *viewFromNib = [[NSBundle mainBundle] loadNibNamed:@"ResultsAssessmentView" owner:self options:nil][0];

4

Пример Swift4, если ваши MyCustomView.swift и MyCustomView.xib находятся во фреймворке. Поместите это в файл инициализации MyCustomView :

let bundle = Bundle(for: type(of: self))
let nib = UINib(nibName: "MyCustomView", bundle: bundle)
if let nibView = nib.instantiate(withOwner: self, options: nil).first as? UIView {
    self.aViewInMyCustomView = nibView
    self.aViewInMyCustomView.frame = self.frame
    self.addSubview(self.aViewInMyCustomView)
    // set constraints
    self.translatesAutoresizingMaskIntoConstraints = false
    NSLayoutConstraint(item: self.aViewInMyCustomView, attribute: .leading, relatedBy: .equal, toItem: self, attribute: .leading, multiplier: 1.0, constant: 0).isActive = true
    NSLayoutConstraint(item: self.aViewInMyCustomView, attribute: .trailing, relatedBy: .equal, toItem: self, attribute: .trailing, multiplier: 1.0, constant: 0).isActive = true
    NSLayoutConstraint(item: self.aViewInMyCustomView, attribute: .top, relatedBy: .equal, toItem: self, attribute: .top, multiplier: 1.0, constant: 0).isActive = true
    NSLayoutConstraint(item: self.aViewInMyCustomView, attribute: .bottom, relatedBy: .equal, toItem: self, attribute: .bottom, multiplier: 1.0, constant: 0).isActive = true
} 

В заключение! Я работаю в модульном проекте iOS и это то, что я ищу. Спасибо!
Фирда Сахиди,

что такое aViewInMyCustomView?
famfamfam

@famfamfam: UIView
norbDEV

спасибо, теперь я знаю, как пользоваться
famfamfam

3

Я также обнаружил, что это не удалось, когда я попытался загрузить XIB с именем вроде @ "MyFile.xib". Когда я просто использовал @ "MyFile", он работал - очевидно, он всегда добавляет расширение. Но в сообщении об ошибке просто говорилось, что он не может найти MyFIle.xib в пакете - если бы он сказал MyFile.xib.xib, это было бы большой подсказкой.


Причина, по которой вы не должны добавлять расширение, заключается в том, что в вашем скомпилированном пакете файлы .xib также компилируются в файлы .nib. Так что на самом деле в вашем пакете не было MyFile.xib, не говоря уже о двойном расширении.
Pieter Jongsma

3

Вероятно, ваш файл XIB находится вне папки вашего проекта. Это приводит к тому, что Target Inspector не отображается. Однако перемещение файла XIB в папку проекта должно исправить это.


2

Работая над Xcode 4.6.3 и локализуя файлы NIB, я также столкнулся с этой проблемой.

Для меня ничего не помогло, кроме изменения "Document Versioning" в File Inspector на Deployment 5.0 вместо 6.1.


2

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

Изменить: с новой стартовой версией Xcode 4.6.3, если вы переименуете (с функцией рефакторинга) класс контроллера, он также переименует файл пера, и вам не нужно беспокоиться о проблеме загрузки пера.


2

У меня только что был интересный опыт использования Xcode 6.3.

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

Наконец, после ответа Брайана Майкла Бентли я наконец решил проверить свой файл .app в папке моего симулятора на моем HD. Я обнаружил, что все мои перья были там, но с abc ~ ipad.nib вместо ожидаемого abc.nib. Я вручную переименовал все эти файлы, чтобы удалить часть ~ ipad, собрал, и все заработало!

Пытаясь понять, почему к ним добавлено ключевое слово ~ ipad, я посмотрел на настройки своего проекта и на самом деле на вкладке «Общие»> «Информация о развертывании» я выбрал только iPad. Я пытался запустить симулятор iPhone. Я считаю, что в прошлом Xcode выдавал ошибку, указывающую, что двоичный файл не поддерживает iPhone, и вам не удастся запустить приложение.

Я удалил приложение из симулятора и сделал то же самое снова - снова с поддержкой только iPad. На этот раз .app содержал abc ~ iphone.nib И abc ~ ipad.nib для каждой ожидаемой раскадровки, и он отлично работал на симуляторе iPhone. Опять же - если мы выберем iPad только в настройках «Информация о развертывании», он не должен работать на iPhone Simulator. Это ошибка Xcode.

Итак, здесь есть некоторая непоследовательность поведения со стороны Xcode, и, к сожалению, это временная ошибка, и ее может быть трудно воспроизвести, но я поместил это здесь, чтобы в будущем это могло помочь другим.


2

Если бы эта же проблема ничего не работала, я подумал о чем-то странном с производными данными.

В xcode 6.3.2 мне пришлось:

В меню XCode -> Настройки -> Вкладка местоположений -> В местоположениях измените производные данные на относительные, а затем переключитесь обратно на значение по умолчанию

Потом перо загрузилось нормально.


Я просто удалил папку Derived Data, и она сработала. Кажется, запуталась, потому что я переименовал файл xib в навигации по проекту. Странным.
Кайл Гослан

2

Будьте осторожны: Xcode чувствителен к регистру в именах файлов. Это не то же самое «Веселье», что «Веселье».


Имя файла для моего пера - FormItemCheckBoxCell.nib, класс - FormItemCheckboxCell. Использование заглавной буквы в названии стоило мне 45 минут моей жизни.
SafeFastExpressive,

1

Если вы используете в своем проекте фреймворки, вам необходимо убедиться, что вы загружаетесь из правильного пакета:

NSBundle *bundle = [NSBundle bundleWithIdentifier:@"<your bundle id here>"];
ABCViewController *vc = [[ABCViewController alloc] initWithNibName:@"<your nib name>" bundle:bundle];

1

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

В инспекторе атрибутов (третья вкладка на правой боковой панели в раскадровке):

  1. Установите идентификатор ячейки (например: «MyCellId»),
  2. Установите класс ячейки (например: «MyCellClass», если файл - «MyCellClass»),
  3. Зарегистрируйте ячейку в контроллере представления следующим образом:

    tableView.register (UINib (nibName: "MyCellClass", bundle: nil), forCellReuseIdentifier: "MyCellId")


0

Получил эту проблему при преобразовании моего старого кода с XCode 3x в XCode 4 и решил ее, просто переименовав wwwwwwww.xib в RootViewController.xib


0

Я столкнулся с той же проблемой. В моем случае имя пера было «MyViewController.xib», и я переименовал его в «MyView.xib». Это избавило от ошибки.

Я также перемещал проект с XCode 3 на 4.2. Изменение типа пути не имело значения.


0

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


0

Каждый раз, когда я реорганизую имя контроллера представления в моем appDelegate, я трачу на это время. Рефакторинг не изменяет имя пера в initWithNibName: @ "MYOldViewControllerName".


0

У меня была такая же проблема, у меня работало переименование идентификатора контроллера представления в раскадровке.


0

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


0
SecondViewController *secondViewController = [[SecondViewController alloc]initWithNibName:@"SecondView.xib" bundle:nil];
    [self.navigationController pushViewController:secondViewController animated:YES];

В приведенном выше коде, если вы также укажете расширение файла, например «SecondView.xib», то это неверно и приведет к ошибке выше. Вместо этого используйте "SecondView". Я совершил ту ошибку.


0

У меня это сработало .. Убедитесь, что вы правильно ввели имя пера.

[[NSBundle mainBundle] loadNibNamed: @ Владелец "Graphview": собственные параметры: nil];

Graphview (имя пера)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.