Не удалось создать экземпляр класса с именем IBNSLayoutConstraint

81

Я использую бета-версию XCode6 и пробую Swift. Когда я устанавливаю некоторые ограничения автоматического макета в контроллер представления, приложение вылетает со следующей ошибкой: Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: 'Could not instantiate class named IBNSLayoutConstraint'

zbrox
источник
Здесь не так много кода :) Контроллер представления - это обычный, только что созданный UIViewController с парой выходов и обычными viewDidLoad и didReceiveMemoryWarning. Кроме того, в Интерфейсном Разработчике есть ограничения. Думаю, я могу добавить сюда код контроллера представления.
zbrox 07

Ответы:

221

Вы получаете эту ошибку, потому что вы установили ограничение для IBOutlet, которое удаляется во время выполнения. Это происходит, когда вы устанавливаете ограничение как заполнитель в Интерфейсном Разработчике. Поскольку ограничение удаляется, когда он идет на разархивирование, он выдает ошибку, говоря, что он не может этого сделать.

Есть два способа исправить это.

Способ 1

  1. Щелкните правой кнопкой мыши на раскадровке> Открыть как> Исходный код.
  2. В открывшемся xml раскадровке найдите placeholder="YES".
  3. Вы найдете ограничения, которые должны быть удалены во время выполнения. Удалите атрибут заполнителя из ограничения, сохраните и закройте.
  4. Запустите приложение, и ваша проблема должна быть решена.

Способ 2

  1. Найдите ограничение, вызывающее ваши проблемы, в Интерфейсном Разработчике. Снимите флажок с параметра «Заполнитель» в графическом интерфейсе. Это должно быть одно из ограничений, установленных для IBOutlet в ViewController, которое вызывает сбой.

Редактор атрибутов Interface Builder, показывающий отмеченную опцию Placeholder.

Вот как это должно выглядеть:

Редактор атрибутов Интерфейсного разработчика, показывающий, что опция заполнителя не отмечена.

Альтернатива

Предполагая, что вы действительно хотите, чтобы ограничение было заполнителем, вам нужно удалить все ссылки на выходы. Для этого выберите ограничение, которое вы хотите использовать в качестве заполнителя. Затем откройте инспектор соединений (крайняя справа кнопка, которая выглядит следующим образом: (->)), а затем удалите все ссылки на выходы, которые могут существовать в этом ограничении.

Сэнди Чепмен
источник
1
Что, если вы хотите, чтобы ограничение было заполнителем? developer.apple.com/library/ios/documentation/UserExperience/…
Даниэль Галаско
2
@DanielGalasko Если вы хотите, чтобы он был заполнителем, не назначайте его IBOutlet.
Sandy Chapman
@SandyChapman В этом есть смысл! Большое спасибо, Сэнди, не могли бы вы включить это в свой ответ, чтобы я мог проголосовать за?
Даниэль Галаско
1
@DanielGalasko, Конечно. Это хороший момент, мой ответ заключался в предположении, что вы хотите установить ограничение на IBOutlet.
Sandy Chapman
@SandyChapman: Есть ли способ узнать, какое ограничение вызывает это? Мой проект слишком велик, чтобы можно было пройти через каждый из них, и дамп стека не указывает, какое ограничение. Кроме того, я попытался найти placeholder = "YES", но не смог найти его в xml.
EmbCoder
6

У меня была такая же проблема сейчас, и у меня сработало следующее.

Я выпустил рабочую версию своего приложения в App Store, вернулся к работе снова через несколько дней, нажав на одну из вкладок в UITabBarController, она вылетела с ошибкой:

Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: 'Could not instantiate class named IBNSLayoutConstraint'

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

Для меня решением было просто отключить классы размеров и сохранить данные классов размеров для iPhone (приложение только для iPhone). Должно быть, это удалило все, что я пропустил в классах размеров. Мне нужны классы размеров, поэтому я снова их включил, и приложение снова заработало.

Филип Мур
источник
Спасибо за ваше сообщение! Просто испытал то же самое, я ничего не менял в своем приложении. В моем случае произошел сбой при загрузке UIPageViewController. Отключение классов размеров и их повторное добавление разрешили ошибку.
nor0x 06
Спасибо!! Тот же опыт, что и nor0x. Очень странно, но замечательно найти здесь решение.
Энди Вайнштейн
4

Это не обязательно может быть проблемой ограничения. Для меня это было вызвано тем, что я не проверил "Установлено" для класса размера, который применялся к моему макету, см. Здесьустановка должна быть проверена

Абиноп
источник
1

Возникла проблема с использованием классов размеров. Я отключил эту опцию в свойствах раскадровки и использую только автоматический макет. Это не было такой большой проблемой, поскольку приложение предназначено только для iPhone.

zbrox
источник
Отключение «Классов размеров» и запуск исправили это и для меня. Затем я снова включаю классы размера, и он продолжает работать.
Джон Фаулер,
1

В конечном итоге со мной произошло то, что я вырезал подвид внутри Interface Builder, чтобы скопировать его в другой xib. Это оставило подпредставление в исходном конструкторе интерфейса xib, и оно было неактивным. После удаления подпредставления с исходного места (путем выбора и удаления). Мне удалось избавиться от ошибки.

Wilforeal
источник
0

В окне инспектора есть опция, когда вы выбираете xib-файл, который не будет использовать ограничения под «Показать файл инспектором» в инспекторе под названием «Использовать автоматическое размещение».

iPatel
источник
Я знаю об этом, но я хочу использовать автоматическое размещение для этой раскадровки.
zbrox 07
Благодарю. Я пробовал поиграть с ними, но это не помогло, так как я также использовал классы размеров. Но я прочитаю это и посмотрю, не упустил ли я что-нибудь. Еще раз спасибо.
zbrox 07
0

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

     delaysContentTouches="NO" canCancelContentTouches="NO"

Но, кроме того, я увидел в своей раскадровке в другой сцене следующий новый фрагмент:

                    <variation key="default">
                        <mask key="subviews">
                            <exclude reference="86H-aM-wei"/>
                        </mask>
                    </variation>

Понятия не имею, откуда это взялось. Сначала я проигнорировал это, потому что, казалось, все работает на моей машине разработчика. Но когда сборка была собрана как Release и протестирована, у меня произошел сбой. Удаление этого ложного (?) Фрагмента устранило сбой и, похоже, не повлияло ни на что другое.

Энди Вайнштейн
источник
0

У меня была эта проблема, когда у меня была кнопка в пользовательском UICollectionViewCell и некоторые из ее ограничений были IBOutlets в этом классе. Я переместил кнопку из ячейки в родительский контроллер представления, и IBOutlets все еще упоминались в ячейке, но на самом деле не существовали в ячейке, поэтому все взорвали. Просто нужно было удалить эти IBOutlets, и все снова заработало!

CMash
источник