Не вдається завантажити 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.