Xcode 8 - IB Designables - Не вдалося надати та оновити статус автоматичного макета, агент зазнав аварії


167

Нещодавно я оновив до Xcode 8, і у мене виникли проблеми із «Розгорткою».

Якщо я відкрию проект, і у мене немає відкритої дошки розгортки, вона складеться і працюватиме добре. Щойно я відкриваю дошку розгортки, я отримую кілька помилок щодо IB Designables, як показано нижче.

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

Ці представлення - це єдині представлення, в яких використовуються власні представлення, TextFieldEffectsі BEMCheckboxякі я імпортував за допомогою Cocoapods.


Можливо, перевірте сховище для Pod, який ви використовуєте, і побачите, чи ця проблема є поширеною серед інших користувачів?
Зольнор

Будь-яка відповідна відповідь на це?
Мохсін Хубайб Ахмед

1
Ви знайшли якесь вирішення?
зануриться

Будьте уважні, проблема може бути ВАМ ПОТРІБНА БУДІВКА для вбудованої бібліотеки . у моєму прикладі я був вбудований Swifter. Зазвичай ви тримаєте під рукою жирну збірку (для розробки - тренажер / телефон) і збірку лише для телефону (для магазину додатків, лише для телефону), і ви просто заміняєтесь на телефон, коли потрібно подати на TestFlight тощо. Я все ще в бібліотеці була лише бібліотека !!!!! До! Заміна на "правильний" жир вирішена проблема.
Fattie

Відповіді:


179

Ви можете спробувати одне з наступних, щоб з’ясувати причину:

  1. шукайте IBDesignablesAgentCocoaTouchжурнали в цьому каталозі: ~/Library/Logs/DiagnosticReportsі дивіться причину.

Примітка: для користувачів з Каталіною: шукайте IBDesignablesAgent-iOS_<DATE>-<MAC_NAME>.crash

  1. Перейдіть до Редактора -> Налагодження вибраного перегляду, вибираючи свою @IBDesignable UIViewна своїй дошці та перегляньте трасування стека.

  2. Видалити папку "Виведення даних".

    Xcode Preference -> Location -> Derived Data
    /Users/YourMacName/Library/Developer/Xcode/DerivedData
    
  3. Очистіть свій проект Shift + Command + Alt + K .

  4. Створіть свій проект Command + B .


35
Використовуючи такий підхід, я зміг з’ясувати, що причина Fatal error: Use of unimplemented initializer 'init(frame:)' for class 'TestIBKit.Button'. Я не знав, що IBDesignablesAgentCocoaTouchвиклики процесу init(frame:)замість цього init?(coder aDecoder:).
Євген Дубінін

5
@YevhenDubinin Дякую, це мені допомогло. Все було добре після того, як я реалізував init(frame:)у своєму підкласі UIButton
doraemon

2
Це вирішило мою проблему, але мені довелося вийти з xCode, перш ніж видаляти отримані дані
Хусам

2
найкраща відповідь init (кадр :) - поширене питання
Michał Ziobro

1
Закрийте xcode та очистіть DerivedData. Це вирішило питання.
Мубашар

80

Я вирішив проблему, зробивши наступне:

  1. Перейти до File > Workspace settings.
  2. Клацніть маленьку стрілку праворуч біля "Отримані дані". Це відкриває додаток Finder у розташуванні DerivedDataпапки.
  3. Зайдіть всередину DerivedDataпапки та видаліть папку, відповідну вашому проекту.
  4. Закрийте Xcode та відкрийте його знову.
  5. Очистіть свій проект shiftcommandk.
  6. побудувати свій проект commandb.
  7. Відкрийте свою розповідь.
  8. Перейти до Editor > Refresh all views.

Оновлено

Іноді просто безпосередньо Іди на Editor > Refresh all viewsроботу. Якщо Refresh all viewsвимкнено функцію, закрийте Xcode та повторіть спробу.


Дякуємо, що опублікували це. Я зробив видалення даних із командного рядка "old school", але проблема зберігалася. Використання вашого методу вирішило проблему для мене.
Адріан

Оновіть усі погляди на виграш і для мене. Дякую!
Майк К.

56

Я просто видаляю подання, яке не вдалося, і натискаю команду + Z, щоб скасувати видалення. Це працює для мене.

Якщо згодом редагувати невдалий вигляд, помилка може повторитися, повторіть вище.


6
Це смішно, але це спрацювало.
Ансарі

1
Дивовижно !! Працював для мене
Нупур Шарма

1
Хто знає, що це може бути відповіддю. Це спрацювало Я досі не можу повірити
Асад Амоді

37

Я зіткнувся з цим питанням у програмі CocoaPod 1.5.0. Рішення полягає в тому, щоб знову встановити стручок (знову встановити струк), як тільки з’явиться ця помилка, або ви можете використовувати натомість CocoaPod 1.4.0. Він прекрасно працює в 1.4.0 (принаймні для мене.)

оновлення:

Додати наступний скрипт у Podfile допоможе мені вирішити проблему в 1.5.0

post_install do |installer|
  installer.pods_project.build_configurations.each do |config|
    config.build_settings.delete('CODE_SIGNING_ALLOWED')
    config.build_settings.delete('CODE_SIGNING_REQUIRED')
  end
end

довідка: https://github.com/Skyscanner/SkyFloatingLabelTextField/isissue/201#issuecomment-381915911


100% вірно. пониження до 1.4.0 вирішило проблему для мене.
ale_stro

4
Відпрацював, 1,5,0 стручків.
Андрій Ошев

3
він s work for me, you should add закінчується до останнього коду.
махді

1
Працював і для мене. Випробував усі інші пропозиції без успіху. Випробувано з Боби 1.3.1
Sal

18

Додавання наступного коду до мого @IBDesignableкласу зробило свою справу.

override init(frame: CGRect) {
    super.init(frame: frame)
}

Це працює для мене. Насправді я додав два переопределення для розширення UITextView. (1) init(frame: CGRect, textContainer: NSTextContainer?), (2) init?(coder aDecoder: NSCoder). Потім відновіть і попередження (помилка) пішло. Не потрібно навіть очищати збірку папок.
Джон Панг

Дякую! Гарна відповідь)
JiosDev

13

Для тих, хто подобається мені, хто не може знайти цей IBDesignablesAgentCocoaTouchфайл або при спробі "Налагодити вибрані представлення" в Редакторі отримує помилку, ось ще один спосіб налагодження цих помилок "Не вдалося зробити".

Відкрийте додаток "Консоль", на бічній панелі виберіть свій поточний Mac (він, мабуть, буде автоматично вибраний за замовчуванням), а потім на панелі пошуку знайдіть "IBSceneUpdate" та натисніть клавішу Enter.

Таким чином, кожного разу, коли ви отримуєте помилку Xcode за IBDesignableнеможливість візуалізації, ви також отримаєте новий запис "IBSceneUpdate" з детальнішою інформацією про помилку.

Принаймні, як я зміг налагодити свої IBDesignableпомилки!

Додаток консолі, що показує помилки IBSceneUpdate


1
Додаток - це фактична консоль, а не термінал, як FYI.
Карл Аптон

Гарний улов! Відредагував мою відповідь.
Стелабурас

11

Якщо ви використовуєте файл xib для користувальницького uiview. Спробуйте це:

Змінити з

Bundle.main.loadNibNamed("UserView", owner: self, options: nil)

До:

let bundle = Bundle(for: UserView.self) 
bundle.loadNibNamed("UserView", owner: self, options: nil)

8

Спробуйте вимкнути "Використовувати зміни ознак" (панель ідентичності та типу) для будь-якого файлу xib, який у вас може бути для користувацьких представлень даних, які використовуються у вашій дошці.


7

мою проблему було вирішено видаленням папок (що пов'язано з цим проектом) із похідної папки даних. Ви можете зробити це, натиснувши Файл -> Налаштування проекту -> Потім натисніть знак стрілки deside /Users/.../Xcode/DerivedData, натисніть папку DerivedData, і ви побачите, що ваш проект з папками видаляє ці. киньте xcode відкрити свій проект, очистіть проект, скориставшись цим кроком Product-> clean, а потім складіть проект: Product-> Build Це дозволить вирішити цю проблему.


4

Правильна відповідь, надана @Maria :

перевірити звіт про аварію на ~/Library/Logs/DiagnosticReports

Альтернативний спосіб :

  1. відчинено Spotlight

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

  1. тип console.app

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

  1. виберіть Crash reports

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

  1. перевірити його IBDesignablesAgent-iOSта переглянути журнал аварій

Використання консолі допомогло мені вирішити свою проблему. Набагато докладніші повідомлення, ніж те, що було в Xcode.
Ендрю Мур


3

Я спробував очистити і запустити проект не вирішить цю проблему.

Але проект закрили та відновили .


2

Коли я налагодив це, я дізнався, що існують деякі класи, які змінюють інтерфейс користувача. Зазвичай маркіруючий позначення - це підклас UILabel або будь-який інший підкласинг класу UIView та малювання ui під час виконання та зіткнення з двигуном Autolayout. Спробуйте надати фіксовану ширину або висоту для цих спеціальних представлень. Якщо це не вирішує вашу проблему, спробуйте наступні рішення: -

Рішення 1: - Відмініть #use_frameworks всередині вашого файла файлу.

Рішення 2: - Спробуйте видалити отримані дані

  1. Закрийте вікно "Редактор" вашого Xcode та вийдіть із симулятора ->
  2. Перейдіть у розділ Налаштування Xcode -> Locations ->
  3. Клацніть маленьку сіру стрілку, яка показує отриманий шлях даних ->
  4. Виберіть проект ->
  5. Видаліть усі папки всередині ->
  6. Закрийте Xcode та відкрийте його знову

1
Не могли б ви детальніше розказати, як це насправді вирішує проблему?
Паула Хасстентеуфель

це вирішило проблему, але досі не знаю, чому знімати цей use_frameworks, оскільки це для швидкого права проекту
Абхішек

Мій Podfile вже використовує фреймворки, будь-які пропозиції минулого не коментують це?
mmr118

@ moni15 я додав ще одне можливе рішення. Будь ласка, перевірте.
Ashish Pisey

Без коментарів #use_frameworks у файлі pod та очищення DerivedData працював на мене.
Jugal Desai

2

У мене було те саме питання, і я прийшов сюди, щоб спробувати і з'ясувати, що сталося. Я помітив найкращу відповідь, і сама відповідь мені не допомогла, оскільки IBDesignable не існував у папці журналів, і я вже спробував там усі інші параметри, проте в коментарях я помітив, що хтось говорив про кадр init.

Я вирішив спробувати прокоментувати моє розширення IBDesignable для UIView і це миттєво вирішило проблему. Отже, щоб виправити це, знайдіть розширення, що викликає проблему, і не забудьте встановити необхідні inits, створивши клас IBDesignable та надавши необхідні ініціалізатори наступним чином:

@IBDesignable class RoundedView: UIView {

override init(frame: CGRect) {
    super.init(frame: frame)
    sharedInit()
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    sharedInit()
}

override func prepareForInterfaceBuilder() {
    super.prepareForInterfaceBuilder()
    sharedInit()
}

func sharedInit() {
}
}

ВАЖЛИВО: не забудьте додати новий клас до елемента, для якого ви використовуєте позначуваний.


1
Як зазначено в його документації, не забудьте зателефонувати на адресу super.prepareForInterfaceBuilder () у вашій програмі PrepaForInterfaceBuilder ().
Jaime S

1

Зіткнувся з такою ж помилкою: Налаштувавши UITextField та використовуючи конструктор інтерфейсів, помилка в консолі була -використання непроведеного ініціалізатора 'init (frame :)' для класу "CustomField"

Додано ініціалізатор, щоб виправити помилку


1

Я зіткнувся з цією проблемою після оновлення до останньої версії XCode. Після спробу декількох варіантів, описаних вище, я лише досить Xcode, а потім вимкніть систему і ввімкніть її, і це працювало для мене.


0

Після того, як ви внесете необхідні зміни, змініть дошку розкадрування або в моєму випадку .xib, щоб відкрити в "XCode 7", збережіть і закрийте. Це лише міра розриву зупинки для усунення помилок, але в кінцевому підсумку вам потрібно буде виправити їх чи робити це до тих пір, поки ви цього не зможете.


0

У моєму випадку я використовував бібліотеку, яка була підкласовою UIView. Він використовував IB_DESIGNABLE, і відсутній дзвінок до [super awakeFromNib]. Щойно я додав виклик до цього методу, помилка пішла.

Я не впевнений, чи IB_DESIGNABLEвплинуло на це той факт, що його реалізація .


Де ви додали код для [super awakeFromNib]? Чи можете ви поділитися своїм кодом?
TheJeff

0

Це найпростіший спосіб для мене: додайте цей сценарій до свого Podfile

Podfile:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    next if target.product_type == "com.apple.product-type.bundle"
    target.build_configurations.each do |config|
      config.build_settings['CONFIGURATION_BUILD_DIR'] = '$PODS_CONFIGURATION_BUILD_DIR'
    end
  end
end

Джерело:

Цей спосіб вирішення для @IBDesignable можна знайти тут: https://github.com/CocoaPods/CocoaPods/isissue/5334

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