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


81

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


Тут не так багато коду :) Контролер перегляду - це звичайний щойно створений UIViewController з кількома розетками та звичайними viewDidLoad та didReceiveMemoryWarning. А ще існують обмеження в Interface Builder. Я думаю, я можу додати сюди код контролера перегляду.
zbrox

Відповіді:


221

Ви отримуєте цю помилку, оскільки встановили обмеження для IBOutlet, яке видаляється під час виконання. Це трапляється, коли ви встановлюєте обмеження як заповнювач у Interface Builder. Оскільки обмеження видалено, коли воно переходить до його архівування, воно видає помилку, сказавши, що не може цього зробити.

Існує два способи виправити це.

Спосіб 1

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

Спосіб 2

  1. Знайдіть обмеження, які спричиняють ваші проблеми, у Interface Builder. Зніміть прапорець біля заповнювача в графічному інтерфейсі. Це повинно бути одним із обмежень, встановлених IBOutlet у ViewController, що спричиняє збій.

Редактор атрибутів Interface Builder, що відображає прапорець Placeholder.

Ось як це повинно виглядати:

Редактор атрибутів Interface Builder, у якому відмічено прапорець Placeholder.

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

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


1
Що робити, якщо ви хочете, щоб обмеження було заповнювачем? developer.apple.com/library/ios/documentation/UserExperience/…
Даніель Галаско,

2
@DanielGalasko Якщо ви хочете, щоб це був заповнювач, то не призначайте його IBOutlet.
Sandy Chapman,

@SandyChapman Це має сенс! Велике спасибі, Сенді, чи не міг би ти включити це у свою відповідь, щоб я міг проголосувати?
Даніель Галаско,

1
@DanielGalasko, звичайно. Це добре, моя відповідь полягала в припущенні, що ви хочете обмеження на IBOutlet.
Сенді Чепмен,

@SandyChapman: Чи є спосіб дізнатись, яке обмеження спричиняє це? Мій проект занадто великий, щоб пройти кожен з них, і дамп стека не є шпилькою, яка вказує на яке обмеження. Крім того, я намагався знайти placeholder = "ТАК", але не зміг знайти жодного в xml.
EmbCoder

6

У мене була така сама проблема саме зараз, і наступне працювало для мене.

Я випустив робочу версію мого додатка в App Store, повернувся до роботи над ним ще через кілька днів, натиснувши на одну з моїх вкладок в UITabBarController, вона зірвалася з помилкою:

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

У мене не було жодних обмежень щодо розміщення заповнювачів, про які мені було відомо, або торгових точок, які не повинні були бути визначені.

Рішенням для мене було просто вимкнути класи розміру та зберегти дані класу розміру для iPhone (додаток призначений лише для iPhone). Це, мабуть, видалило все, що я пропустив у класах розміру. Мені потрібні класи розмірів, тому я знову їх увімкнув, і додаток знову запрацював.


Дякуємо за ваш пост! Просто пережив те саме, я нічого не змінив у своєму додатку. У моєму випадку він зірвався при завантаженні 'UIPageViewController'. Вимкнення класів розміру та їх повторне маркування вирішило помилку.
nor0x

Дякую!! Той же досвід, що і nor0x. Дуже дивно, але дуже чудово знайти тут рішення.
Енді Вайнштейн,

4

Це може бути не обов'язково обмежувальною проблемою. Для мене це було викликано тим, що я не встановив прапорець "Встановлено" для класу розміру, який застосовувався до мого макета, див. Тутустановку потрібно перевірити


1

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


Вимкнення "Класів розміру" та запуск також виправили це для мене. Потім я знову ввімкнув класи розмірів, і він продовжував працювати.
Джон Фаулер,

1

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


0

У вікні інспектора є опція, коли ви вибираєте файл xib, який не використовуватиме обмежень у розділі "Показати файл інспектора" в інспекторі під назвою "Використовувати авторозкладку".


Я знаю про це, але я хочу використовувати авторозкладку для цієї розкадровки.
zbrox


Дякую. Я намагався пограти з ними, але це не дуже допомогло, оскільки я також використовував класи розмірів. Але я прочитаю це і подивлюсь, чи щось я пропустив. Знову дякую.
zbrox

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 і все знову працювало нормально!

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