Загруженный наконечник, но выход «view» не установлен

742

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

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

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

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

Джон
источник
1
Попробуйте очистить сборку в первую очередь.
LetynSOFT
В моем случае настоящей ошибкой было то, что я определил метод в viewController (- (void) setValue: (NSNumber *) value forKey: (NSString *) key), который переопределяет метод ViewController, вызывающий ошибку. Я решил переименовать этот метод
христианский мини

Ответы:

1807

Вы, ребята, правы, но, поскольку я новичок, мне потребовалось немного времени, чтобы выяснить все шаги, чтобы сделать это. Вот что сработало для меня:

  • Откройте файл XIB, вызывающий проблемы
  • Нажмите на значок владельца файла на левой панели (верхняя часть выглядит как желтое поле)
  • Если вы не видите правую боковую панель, нажмите на третий значок над «видом» на панели инструментов. Это покажет правую боковую панель
  • В правой боковой панели нажмите на третью вкладку - ту, которая выглядит как газета
  • В «Custom Class» вверху убедитесь, что Class - это имя ViewController, которое должно соответствовать этому представлению. Если нет, введите его
  • В правой боковой панели нажмите на последнюю вкладку - ту, которая выглядит как круг со стрелкой на ней
  • Вы должны увидеть «розетки» с «видом» под ним. Перетащите кружок рядом с ним на значок «вид» на левой панели (нижний, похожий на белый квадрат с толстым серым контуром
  • Сохраните XIB и повторите
Джош Джастис
источник
Я также столкнулся с этой проблемой на какао, и пока представление не загружалось / не добавлялось в иерархию представлений, все выходы представления были NIL. После вызова addSubview или чего-то подобного все розетки были подключены. Самое смешное в моей истории было то, что po viewcontroller.view.subviews показывал недостающие объекты.
Апок
11
Это решение больше не работает в Xcode 7.3 с шага 4 и 5. Вместо этого в конструкторе интерфейса перетащите Control от владельца файла к представлению.
PeiweiChen
2
У меня не сработало (нет раздела розеток в инспекторе соединений, поэтому нет «вида» под розетками для подключения), но +1 за усилие, которое вы вложили в свой ответ. :)
Уильям Т. Маллард
2
Если вы не видите «представление» в торговых точках, вы также можете ctlr-перетащить из файла владельца в представление на раскадровке. Должно появиться контекстное меню с опцией «view»
josef
1
@ WilliamT.Mallard У меня такое же поведение. MyViewControllerявляется подклассом подкласса UIViewControllerи отсутствует в viewразделе "Розетки". Если я подкласс MyViewControllerпрямо из UIViewControllerпредставления, появляется Unter "Outlets". Магия или ошибка Xcode.
user2319066
201

Это предложение Джоша Джастиса, но в графической форме (фотографии мои):

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

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

  1. На правой боковой панели выберите oultets
  2. Перетащите вид розетки для просмотра компонента

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

Наконец, View Controller создается с использованием скользящего кода:

        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
Спасибо Хавьер Калатрава Llavería ... очень помог мне после удара головой в течение часа!
BharathRao
un exito muchas gracias
Бруно Соса Fast Tag
Я пропустил 5-й шаг
hamada147
73

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

Рохит Мандивал
источник
62

Идентификация представления - Идентификация класса не установлена. После установки соответствующего класса проблема была решена.

Джон
источник
Привет @ Джон, я сделал это, но все еще получаю это исключение.
Мансуу ....
29

Вы уверены, что у вас есть UIView (или подкласс), назначенный свойству "view" вашегоViewViewController?

Щелкните правой кнопкой мыши «Владелец файла» в левой панели XIB для вашего ViewController и убедитесь, что установлен выход «просмотр». Если нет, установите его для просмотра!

это определенно решит проблему

Шехбаз Хан
источник
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.

manapate
источник
Потрясающие. Огромное спасибо. Это должен быть принятый ответ!
Роман
7

Моя проблема с этим была вызвана наличием дублирующего пера в папке класса, который не имел установленного представления. Казалось, xcode выбирает один кончик для сборки, а затем другой, когда я собирал проект в следующий раз. Просто удалил другой. Выглядит хорошо. Doh!

Matt
источник
6

Просто потратил больше часа, пытаясь выяснить, почему мое свойство view не установлено в моем контроллере представления после его инициализации с помощью nib. Не забудьте вызвать «[super initWithNibName ...]» внутри initWithNibName контроллера представления.

Kamil.S
источник
5

Я только что исправил это в своем. Большой проект, два файла. Один был «ReallyLargeNameView», а другой - «ReallyLargeNameViewController»

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

Поэтому я удаляю похожий именованный класс (который является представлением). Вскоре новая ошибка «розетка внутри не подключена» буквально была «webView, а не значение ключа», бла… в основном, говоря «Visual Studio лучше». Во всяком случае ... Я стираю меньший именованный файл, и БАМ, это работает.

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

Хотелось бы, чтобы у меня был более технический ответ, чем «XCode в замешательстве», но хорошо, xCode сильно запутался на этом этапе. Не путать это так же, как я помогу маленькому ребенку. Это работает сейчас, :) Должно принести пользу другим, если вышесказанное ничего не исправит.

Всегда не забывайте чистить свои сборки (удаляя также симулятор)

Стивен Дж
источник
4

У меня также была та же проблема, и моя проблема заключалась в том, что я добавил другую локализацию (английский) в перо ViewControllers, чтобы мое приложение с немецким языком локализации не смогло найти перо с английской локализацией !! Надеюсь, это кому-нибудь поможет!

Weini
источник
4

Я столкнулся с той же проблемой, когда случайно удалил ссылку на xib и добавил ее снова. Я просто исправил, установив соединение между владельцем файлов и представлением. Также убедитесь, что пользовательский класс FilesOwner - это ваш ожидаемый viewController.

Nidhin
источник
3

Для меня проблема была вызвана звонком initWithNibName:bundle:. Я использую ячейки табличного представления из файла пера, чтобы определить формы ввода, которые сидят tableViews. Поскольку у меня нет представления, не имеет смысла подключаться к одному. Вместо этого, если я initWithStyle:вместо этого вызываю метод, а изнутри я загружаю nib-файл, тогда все работает как положено.

DaveDude
источник
3

Предыдущие ответы почти решили проблему для меня, но последний шаг отсутствовал.

  1. Создайте файл xib и swift с тем же именем.

Добавить просмотр и Swift файл

  1. Установите владельца файла в качестве подкласса UIView.

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

  1. Перетащите выход из представления в подкласс UIView, назовите его «contentView»

добавить contentview

  1. Добавьте этот пользовательский инициализатор, чтобы при загрузке XIB он прикреплял contentView

добавить 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

У меня была та же проблема, но требовалось немного другое решение. Проблема в этом случае заключалась в классе владельца файла, а не в классе представления. Чтобы установить это, я должен был щелкнуть значок «Воспроизведение в обратном направлении» в левом нижнем углу окна Interface Builder, и затем появились параметры, которые изолировали характеристики Владельца файла, Первого ответчика и Представления. Нажав на первый (большой прозрачный блок), я смог установить его собственный класс, как предложено выше.

Майкл Стерн
источник
2

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

user1951454
источник
2

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

Я разместил детали в ответе на этот похожий вопрос .

Кора Миддлтон
источник
2

В моем случае назначенный инициализатор - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil в классе *** ViewController был реализован, поэтому даже если я вызову другой инициализатор для инициализации объекта, будет вызван указанный инициализатор.

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

lynulzy
источник
2

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

Если я просто создал новый xib-файл, добавил к нему UIViewController в Интерфейсном Разработчике и установил пользовательский класс этого UIViewController в свой контроллер представления, что привело к аварийному завершению «выход розетки не установлен». В других решениях здесь говорится, что перетаскивание контрольной точки перетаскивается в представление, но для меня розетка обзора была серой, и я не мог ее перетаскивать.

серый цвет

Я понял, что моя ошибка была в добавлении UIViewController в Интерфейсный Разработчик. Вместо этого мне пришлось добавить UIView и установить пользовательский класс владельца файла на мой контроллер представления. Затем я мог бы перетаскивать вывод представления владельца файла в мой новый вид UIView, и все работало как надо.

Брайан Кендиг
источник
1

Просто была та же ошибка в моем проекте, но другая причина. В моем случае у меня была настройка IBOutlet с именем «View» в моем пользовательском классе UITableViewController. Я знал, что «представление» было особенным, потому что это член базового класса, но я не думал, что View (другой случай) также будет проблемой. Я предполагаю, что некоторые области какао не чувствительны к регистру, и, вероятно, загрузка xib является одной из этих областей. Поэтому я просто переименовал его в DefaultView, и теперь все хорошо.

eselk
источник
1

выберите владельца файла и перейдите к открытию инспектора идентификации и дайте имя класса, которому он соответствует. Если ни один из описанных выше способов не работает, но вы все еще не видите выходное окно просмотра, тогда дайте новую ссылку на выходное соединение с владельцем файла, тогда вы сможете увидеть выходное окно просмотра. Нажмите на View Outlet, чтобы установить связь между View Outlet и владельцем файла. Запустите приложение, это работает нормально.

Абхилаш Редди Каллепу
источник
1

В моем случае вид не просматривался в xib. в xib представление было size = none (4-я вкладка справа). Я установил размер Freeform и перезагрузил xCode. просмотр был обжалован, и я установил правильную ссылку на просмотр.

OrdoDei
источник
1

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

Я нахожу эту проблему специально с созданием файлов отдельно в Swift.

Трэвис М.
источник
1

для меня это случилось, когда

  • У меня есть класс ViewController (.mm / h), связанный с файлом 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 отсутствовал ,, добавление этой строки решило мою проблему.

Amitg2k12
источник
1

У меня была та же проблема, я понял, и это потому, что я пометил « Статические ячейки » в свойствах табличного представления под опцией контента . Сработало, когда оно изменилось на " Dynamic Prototypes". Снимок экрана ниже. введите описание изображения здесь

Saranjith
источник
1

У меня была похожая проблема с Xcode 9.3, и установка «Модуль» в инспекторе атрибутов «Владелец файла» для модуля проекта устранила это для меня.

nananta
источник
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) Потратил на это пару часов.

BrianH
источник