Завантажена ручка, але розетка 'view' не встановлена


742

Я додав новий файл nib до свого проекту та спробував його завантажити.

Однак, коли я натискаю на піктограму панелі інструментів, яка повинна привести мене до перегляду, який я створив, я отримую повідомлення NSInternalInconsistencyExceptionіз повідомленням:

Закінчення програми через невиконаний виняток "NSInternalInconsistencyException", причина: '- [UIViewController _loadViewFromNibNamed: bundle:] завантажив ручку "...", але розетка перегляду не встановлена. "

Тому я відкрив свій файл nib, і я бачу, що немає встановлених посилань. Однак я намагаюся натиснути і перетягнути коло для "нової посилання на розетку" до власника файлу, але це не дозволить мені ... що мені потрібно зробити, щоб мій погляд відображався?


1
Спробуйте спочатку очистити збірку.
LetynSOFT

У моєму випадку справжньою помилкою було те, що я визначив метод у viewController (- (void) setValue: (NSNumber *) значення forKey: (NSString *) ключ), який замінює метод ViewController, викликаючи помилку. Я вирішив перейменувати цей метод
християнський міні

Відповіді:


1807

Ви маєте рацію, але, як я новачок, мені знадобилося трохи часу, щоб розібратися в усіх кроках для цього. Ось що для мене спрацювало:

  • Відкрийте файл XIB, що спричинить проблеми
  • Клацніть піктограму власника файлу на лівій панелі (верхній, схожий на жовте окреслене поле)
  • Якщо ви не бачите правої бічної панелі, натисніть на третю піктограму вгорі "Перегляд" на панелі інструментів. Це покаже праву бічну панель
  • На правій бічній панелі натисніть на третю вкладку - ту, яка трохи нагадує газету
  • У розділі "Спеціальний клас" вгорі переконайтесь, що Class - це ім'я ViewController, яке повинно відповідати цьому погляду. Якщо ні, введіть його
  • На правій бічній панелі натисніть на останню вкладку - ту, що має вигляд кола із стрілкою
  • Ви повинні побачити "торгові точки" з "поданням" під ним. Перетягніть коло поруч із ним до піктограми «вид» на лівій смузі (нижній, схожий на білий квадрат з густим сірим контуром
  • Збережіть xib та повторно запустіть

Я також стикався з цією проблемою щодо какао, і поки представлення не завантажувалося / додавались до ієрархії перегляду, усі точки перегляду були NIL. Після виклику addSubview або чогось подібного всі мережі були підключені. Найсмішнішою частиною моєї історії було те, що po viewcontroller.view.subviews показали відсутні об'єкти.
Апок

11
Це рішення більше не працює в Xcode 7.3 з кроків 4 і 5. Замість цього в програмі інтерфейсів перетягніть Control від власника файлу до перегляду.
PeiweiChen

2
Не працював для мене (жоден розділ розеток у інспектора підключення, таким чином, не "перегляд" під розетками для підключення), але +1 за зусилля, які ви доклали до своєї відповіді. :)
Вільям Т. Маллард

2
Якщо ви не бачите "перегляд" у торгових точках, ви також можете перетягнути ctlr від власника файлів до подання на розкладі. Контекстне меню повинно з'явитися з опцією «виду»
Йозеф

1
@ WilliamT.Mallard У мене така ж поведінка. MyViewControllerє підкласом підкласу UIViewControllerта немає viewпід "Outlets". Якщо я підклас MyViewControllerпрямо з UIViewControllerподання, з'явиться unter "Outlets". Магія або помилка Xcode.
user2319066

201

Це пропозиція Джоша Справедливості, але графічно (зображення мої):

  1. Виберіть Власник файлу
  2. На правій панелі виберіть спеціальний клас.
  3. Введіть назву спеціального класу

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

  1. На правій панелі виберіть ультети
  2. Перетягніть вигляд для перегляду компонента

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

Нарешті Контролер перегляду інстанціюється прокатуючим кодом:

        PTFilterUserVC *aFilterUserVC = [[PTFilterUserVC alloc] initWithNibName:@"FilterVC" bundle:nil];

        //OPTIONAL.This is how 'I' am interested in present the view controller.
        [self.navigationController pushViewController:aFilterUserVC animated:YES];

1
Дякую Хав'єру Калатраві Льоверія ... мені дуже допомогли після удару головою протягом години !!!
BharathRao

un exito muchas gracias
Bruno Sosa Fast Tag

Я пропустив 5-й крок
hamada147

73

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


62

Ідентифікатор виду - ідентичність класу не встановлена. Після встановлення відповідного класу питання було вирішено.


Привіт @John, я це зробив, але все ж отримую цей виняток.
Mansuu ....

29

Ви впевнені, що властивості "view" вашогоViewController присвоєно UIView (або підклас)?

Клацніть правою кнопкою миші на "Власник файлу" на лівій панелі xib для вашогоViewController і перевірте, чи встановлено розетку "view". Якщо ні, встановіть його для перегляду!

це однозначно виправить Випуск


2
Чітка, лаконічна відповідь.
sark9012

15

Для мене всі речі, зазначені тут https://stackoverflow.com/a/6395750/939501, були правдивими, але все-таки це була помилка кидання. Причиною було те, що я створив клас View з іменем ABCView, а потім видалив його пізніше, я додав контролер перегляду як ABCViewController, тому якимось чином мав на увазі старий ABCView в новому контролері перегляду, мені довелося видалити ABCViewController і додати нове з іншим ім'ям, яке вирішило мою проблему.

Дякую


Все-таки помилка в 2020 році.
Тамас Сенгель

15

У мене була така ж проблема з XCode 4.6.3. Я почав з парою файлів з ім'ям MySettingsView.hі , .mале вони були видалені на користь MySettingsViewController.h, але не дивлячись на спроби більшості натяків згаданих тут, вона до цих пір зберігається erroring с,

2013-07-05 11: 48: 17.205 MyApp [39024: c07] *** Запуск програми через невиконаний виняток "NSInternalInconsistencyException", причина: '- [UIViewController _loadViewFromNibNamed: bundle:] завантажив ручку "MySettingsView", але вигляд огляду не було встановлено. '

Очевидно, він все ще "плутався", намагаючись завантажити MySettingsView.xib замість MySettingsView Controller .xib. Можливо, його "робити те, що я маю на увазі" логіка занадто фантастична.

Тому я вирішив проблему, жорстко кодуючи ім'я NIB / XIB в MySettingsViewController.m:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:@"MySettingsViewController" bundle:nibBundleOrNil];
}

10

Кожен, хто використовує метод xib для створення UIView і має цю проблему, ви помітите, що у меню інспектора з’єднань ви не матимете розетку "view". Але якщо ви встановите власний клас власників файлів на UIViewController, і тоді ви побачите розетку "view", яку ви зможете просто CMND підключити розетку до CustomView.


Дивовижно. Дуже дякую. Це має бути прийнятою відповіддю!
Роман

7

Моя проблема з цим була спричинена тим, що в папці класу дублікат не було встановлено. Здавалося, що xcode обирає одну ручку для збірки, а потім іншу наступного разу, коли я будую проект. Щойно видалили інший. Виглядає добре. До!


6

Щойно витратив більше години, намагаючись з’ясувати, чому властивість перегляду не встановлена ​​в моєму контролері перегляду після ініціювання її від кнопки. Не забудьте викликати "[super initWithNibName ...]" всередині initWithNibName диспетчера.


5

Я просто це зафіксував у своєму. Великий проект, два файли. Один був "ReallyLargeNameView", а інший - "ReallyLargeNameViewController"

На основі другої відповіді, обраної вище, я вирішив, що я повинен очистити свою збірку. Нада, але я все ще підозрювалась у XCode (так як у мене є два однакові класи, слід їх абстрагувати, але так ...) Отже, один працює, а ні - немає. Імена власників файлу поки що копіюють та вставляють, торгові точки відновлюються, xCode перезавантажується, все ще нічого.

Тому я видаляю подібний названий клас (який є переглядом). Незабаром нова помилка "розетка всередині не підключена" буквально була "webView не ключовим значенням", але ... в основному кажучи "Краще Visual Studio". У будь-якому випадку ... Я стираю менший файл з назвою, і bam, він працює.

XCode плутають файли з аналогічними назвами. І проект досить великий, щоб його потрібно було трохи перезавантажити, що може бути його частиною.

Хотілося б, щоб у мене була більш технічна відповідь, ніж "XCode плутається", але добре, що xCode в цей момент сильно плутається. Розплутавши це так само, я б допомогла маленькій дитині. Це працює зараз, :) Має приносити користь іншим, якщо вищезазначене нічого не виправить.

Завжди не забудьте очистити свої склади (видаливши також тренажер)


4

У мене також була така ж проблема, і моя проблема полягала в тому, що я додав іншу Локалізацію (англійською мовою) на ручку ViewControllers, тому моє додаток з німецькою мовою локалізації не могло знайти підключення з англійською мовою локалізації !! Сподіваюсь, це допомагає комусь!


4

Я зіткнувся з тією ж проблемою, коли випадково видалив посилання xib і додав його знову. Я просто виправився, встановивши зв’язок між власником файлів і представленням. Також переконайтеся, що призначений для вашого класу FilesOwner очікуваний viewController.


3

Для мене проблема була викликана дзвінками initWithNibName:bundle:. Я використовую комірки подання таблиці з файлу nib, щоб визначити форми входу, які сидять tableViews. Оскільки я не маю виду, не має сенсу підключатися до одного. Натомість, якщо я зателефоную на initWithStyle:метод, а зсередини завантажую файл nib, тоді все працює як очікувалося.


3

Попередні відповіді майже вирішили проблему для мене, але останній крок був відсутній.

  1. Створіть файл xib та swift з тим самим іменем.

Додати файл перегляду та швидкого переходу

  1. Встановіть власником файлу підклас UIView.

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

  1. Перетягніть розетку з представлення в підклас UIView, назвіть його "contentView"

додати перегляд вмісту

  1. Додайте цей спеціальний ініціалізатор, щоб, коли завантажується xib, він додає contentView

додати перегляд вмісту як підзагляд

required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        Bundle(for: self.classForCoder).loadNibNamed("SampleView", owner: self, options: nil)
        addSubview(contentView)
        contentView.frame = self.bounds
        contentView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
    }

Тепер будь-які додані вами @IBOutlets будуть додані.

Ура, Річард


2

У мене була така ж проблема, але було запропоновано дещо інше рішення. Проблемою в цьому випадку був клас власника файлів, а не клас перегляду. Щоб встановити це, мені довелося натиснути на піктограму "відтворити назад" у лівому нижньому куті вікна Інтерфейсу, і тоді з'явилися параметри, що виділяють характеристики власника файлів, першого відповідача та перегляду. Натиснувши на перший (великий прозорий ящик), я дозволив мені встановити його спеціальний клас, як було запропоновано вище.


2

У мене була така ж проблема, але було вимагано інше рішення. Проблема в цьому випадку полягала в тому, що клас власника файлу не був підключений до файлу xib.


2

Я зіткнувся з чимось дуже схожим сьогодні ввечері, з підкласом Swift UIViewController. У цьому випадку жодне з вищезазначених виправлень не спрацювало, але переупорядкування мого коду мало. Net-net, що має розширення до підкласу, виникає до того, як саме визначення підкласу в тому ж файлі, здається, плутає XCode, незважаючи на компіляцію штрафу; виправленням було розміщення розширень після визначення підкласу.

Я опублікував деталі у відповіді на подібне запитання .


2

У моєму випадку призначений ініціалізатор - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNilу *** ViewController класі був реалізований, навіть якщо я викликаю інший ініціалізатор для ініціалізації об'єкта, буде викликаний призначений ініціалізатор.

Тож вирішити цю проблему перевіряючи далі, - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNilце також правильний спосіб.


2

Я зіткнувся з цією проблемою дещо іншим чином, ніж інші відповіді тут.

Якщо я просто створив новий файл xib, до нього додав UIViewController в Interface Builder і встановив, що користувацький клас UIViewController призначений для мого контролера перегляду, що призвело до краху "розетки перегляду не встановлено". Інші рішення тут говорять про те, щоб перетягнути розетку перегляду до Перегляду, але для мене розетка перегляду була сірою, і я не міг перетягнути її.

продовольчий вигляд

Я зрозумів, що моя помилка полягала в додаванні UIViewController в Interface Builder. Натомість мені довелося додати UIView і встановити спеціальний клас власника файлу на свій контролер перегляду. Тоді я міг контролювати і перетягувати розетку перегляду власника файлу до мого нового UIView перегляду, і все працювало як слід.


1

Просто в моєму проекті була однакова помилка, але інша причина. У моєму випадку у мене було встановлено IBOutlet з назвою "Вид" у моєму користувальницькому класі UITableViewController. Я знав, що "погляд" був особливим, оскільки він є членом базового класу, але не думав, що View (інший випадок) також буде проблемою. Я думаю, що деякі ділянки какао не відрізняються від регістру, і, ймовірно, завантаження xib є однією з таких областей. Тому я просто перейменував його на DefaultView і зараз все добре.


1

виберіть власника файлів та відкрийте інспектор ідентифікації та дайте ім'я класу, якому воно відповідає. Якщо жоден з перерахованих вище методів не працює, і ви все ще не можете побачити розетку представлення даних, тоді надайте нове посилання на розетку Підключення до власника файлу, тоді ви зможете побачити розетку перегляду. Клацніть на вигляд Outlet, щоб встановити з'єднання між View Outlet та власником файлу. Запустіть додаток, це добре працює.


1

У моєму випадку погляд не переглядався у xib. у xib Вид був розміром = жодним (4-а вкладка праворуч). Я встановлюю розмір Freeform і перезавантажую xCode. view було оскаржено, і я встановив належне посилання на View.


1

Якщо ви спробували все, і ви все-таки отримуєте цю помилку, спробуйте знову створити файл класу з нуля, але пам’ятайте встановити прапорець «Також створити XIB-файл». Це автоматично зв’яже кілька елементів, які не пов'язані під час створення цих файлів окремо. Після того, як це буде створено, ви, ймовірно, можете вирізати та вставити все на новий XIB, і він повинен працювати нормально.

Цю проблему я знаходжу саме зі створення файлів окремо в Swift.


1

для мене це сталося, коли

  • У мене клас ViewController (. Мм / год), пов'язаний з файлом Nib,
  • UIView з цього ViewController потрібно завантажувати на інший вигляд у вигляді підпідгляду,

  • ми назвемо щось подібне

    -(void)initCheckView{
    
       CheckView *pCheckViewCtrl = [CheckView instance];
    
       pCheckView = [pCheckViewCtrl view];
    
       [[self view]addSubview:pCheckView];
    
       [pCheckViewCtrl performCheck];        
    
    }

Де

+(CheckView *)instance{
    static CheckView *pCheckView = nil;
    static dispatch_once_t checkToken;

    dispatch_once(&checkToken, ^{
        pCheckView = [[CheckView alloc]initWithNibName:@"CheckView" bundle:nil];
        if ( pCheckView){
            [pCheckView initLocal];
            **[pCheckView loadView];**
        }
    });

    return pCheckView;

}

Тут loadView відсутній ,,, додавання цього рядка вирішило мою проблему.


1

У мене була така ж проблема, я зрозумів, і це через те, що я поставив галочку " Статичні комірки " у властивостях " Перегляд таблиці" в параметрі "Зміст" . Працював, коли він змінився на " Dynamic Prototypes". Знімок екрана нижче. введіть тут опис зображення


1

У мене була аналогічна проблема з Xcode 9.3, і налаштування «Модуля» під інспектором атрибутів «Власник файлу» на модуль проекту виправило це для мене.


1

Відкрийте розкадрування файл , де ваш ViewController існує, або XIB пов'язаний файл з textEdit.app і перевірте, розкадровка або ім'я XIB такий же вашої ViewController, а потім змінити його, зберегти і перезавантажити / перезапустити Xcode.


1

Якщо ви використовуєте користувацький метод init, перевірте, чи повертаєте ви щось дійсне. Я наткнувся на фрагмент коду, який розбився на щось подібне:

- (id)init {
   self = [super init];
   if (self) {
      CustomController *controller = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass(className) owner:self options:nil];
   } return self;
}

В іншому класі контролер був створений так:

CustomController *controller = [[CustomController alloc] init];

Проблема полягає в тому, що в методі init self не змінився і замість цього повинен виглядати так:

- (id)init {
   self = [super init];
   if (self) {
      CustomController *controller = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass(className) owner:self options:nil];
      [controller viewDidLoad];
      self = controller;
   } return self;
}

0

Я хотів би другий Стівен Дж. Іноді X Code просто плутається. У мене просто був досвід, коли я багато грав у інтерфейсі та досить багато разів додавав та видаляв торгові точки. Торговельні точки просто більше не перестануть працювати. Я ніколи не з'ясовував конкретної причини (я спробував усі рішення вище), і мені просто довелося видалити NIB і відтворити його з нуля, і насправді довелося використовувати іншу назву для NIB, перш ніж воно запрацювало. (XCode 4.6.1) витрачав на це пару годин.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.