Не вдається завантажити NIB в комплекті


111

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

Тепер я даю команду build цьому проекту, потім виконую ./build.pyі, нарешті, виконую titanium runкоманду. Він запускає додаток в тренажері з порожнім екраном і відразу ж виходить з ладу, кидаючи наступну помилку.

Додаток, який припиняється через виняток "NSInternalInconsistencyException", причина: "Не вдалося завантажити NIB в пакеті:" NSBundle </ Користувачі / abhilash / Бібліотека / Підтримка програм / iPhone Simulator / 4.2 / Програми / 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написано правильно


це легко, оскільки прізвисько не введено автоматично
chings228

1
Він мав на увазі назву класу безпосередньо перед аллоком, який є автоматичним: P
Gil Sand

uiview може бути завантажений з nib, але не має initWithNibName:bundle:методу
Vyachaslav Gerchicov

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

@ chings228 XXXControlloer та XXXController, дивіться різницю
Запорожченко Олександр

15

У мене була така ж проблема (виняток "Не вдалося завантажити NIB в пакеті: ..") після оновлення мого xcode з 3.2 до 4.02. Тоді як розгортання мого додатка з Xcode 3.2 відмінно спрацьовує, воно збивається з xcode 4, викликаючи згаданий вище виняток, - але лише тоді, коли я намагався розгорнути в IOS Simulator (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]). Також уважно перевірте ім’я файлу, оскільки воно чутливе до регістру
Хануман


Я вніс запропоновані вами зміни, але не мав успіху.
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, і побачив усі файли, які я очікував, крім одного файлу, того, на який він скаржився, з великим літером замість малого регістру в імені (zoomieVIew.nib замість zoomieView.nib ). Я помітив верхній регістр I у назві файлу xib, змінив його та відновив; мабуть, Xcode залишив створене ім’я .nib таким, яким воно було. Я видалив zoomieVIew.nib у комплекті, перебудував і Xcode належним чином відтворив файл як zoomieView.nib. Додаток почав працювати на пристрої.


тут те саме, що описує Майкл. Я створив файл xib, що містить власну UITableViewCell. коли я відкриваю .app і шукаю myCell.xib, я бачу, що це насправді myCell.nib. Крім того, додаток розбивається лише на пристрої і завантажує файл xib в порядку під час виконання на тренажері. скинути його було трохи складно. принаймні для мене. тільки коли я видалив файл, очистив ціль і скопіював файл назад - це працювало.
Нір Пенгас

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

дох. як я міг знову змусити себе до цього. дякую добру людину :) Я був на самому початку дослідження цієї проблеми
шестнадцять

6

У мене була ця проблема із дошкою розкадровки, і підказку називали щось на кшталт "bKD-J3-fhr-view-ZSR-8m-2da".

Це було тому, що я намагався додати підвід до self.view в init контролера перегляду (withCoder). Самовигляд ще не існує.

Перенесли його на 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" із "Copy Bundle Resources"
i89

5

Для розкадрування

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

Щойно я почав створювати свіжі контролери та перегляди в тестовому додатку розкадрівки, я виявив, що мені не вистачає ідентифікатора розвідки мого контролера.

Тож ось моє рішення, якщо ви хочете перейти з ViewController A -> Переглянути контролер 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 в рамках. Помістіть це в init 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: a UIView
norbDEV

tks, тепер я знаю, як користуватися
famfamfam

3

Я також виявив, що не вдалося, коли я спробував завантажити XIB з таким ім'ям, як @ "MyFile.xib". Коли я просто використовував @ "MyFile", він працював - мабуть, він завжди додає розширення. Але повідомлення про помилку просто сказало, що він не може знайти MyFIle.xib у пакеті - якби він сказав MyFile.xib.xib, це було б великою підказкою.


Причина, що ви не повинні додавати розширення, полягає в тому, що у вашому компільованому пакеті файли .xib також збираються у файли .nib. Отже, у вашому пакеті насправді не було MyFile.xib, ніколи не пам’ятайте про подвійне розширення.
Пітер Джонгма

2

Працюючи над Xcode 4.6.3 та локалізуючи свої файли NIB, я також стикаюся з цією проблемою.

Для мене нічого іншого не допомогло, крім зміни "Версії документа" в File Inspector на Deployment 5.0 замість 6.1.


2

Це трапляється при перейменуванні файлу nib. Якщо у вас вже є, створіть нову нитку (тобто скопіюйте вміст поточного файлу nib в новий nib), видаліть старий файл nib, і це вирішить вашу проблему.

Редагувати: З новою 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 AND abc ~ ipad.nib для кожної очікуваної розкадровки, і він просто працював на iPhone-симуляторі. Знову ж таки - якщо ми вибираємо iPad лише в налаштуваннях Інформації про розгортання, він не повинен працювати на iPhone Simulator. Це помилка Xcode.

Отже, тут є деяка непослідовна поведінка з боку Xcode, і, на жаль, це невпинна помилка, і це може бути важко відтворити, але я ставлю це тут, щоб це могло допомогти іншим у майбутньому.


2

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

У xcode 6.3.2 мені довелося:

У меню XCode -> Налаштування -> Вкладка Місцеположення -> У місцях розташування Змініть отримані дані на відносні та поверніться до значення за замовчуванням

Тоді шпилька завантажилася дрібно.


Щойно я видалив папку «Отримані дані», і вона працювала. Здається, заплутався, бо я перейменував файл xib у навігацію за проектом. Непарний.
Кайл Гослан

2

Ваш файл XIB, ймовірно, знаходиться поза вашою папкою проекту. Це призводить до того, що не з’являється цільовий інспектор. Однак переміщення файлу 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", пакет: nil), forCellReuseIdentifier: "MyCellId")


0

Зробив цю проблему під час перетворення мого старого коду з XCode 3x в XCode 4 і вирішив його, просто перейменувавши wwwwwwww.xib в RootViewController.xib


0

Я зіткнувся з тією ж проблемою. У моєму випадку прізвище було "MyViewController.xib", і я перейменував його на "MyView.xib". Це позбулося помилки.

Я також переміщав проект з XCode 3 до 4.2. Зміна типу Шлях не мала значення.


0

Також причиною може бути те, що файл шукається в папці з невірною мовою, коли ви псуєтесь з локалізаціями.


0

Кожен раз, коли я переробляю ім'я контролера перегляду, яке є в моєму додаткуDelegate, я витрачаю час на це. Рефакторинг не змінює ім'я ручки в 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.