Xcode 8 - IB Designables - не удалось отобразить и обновить состояние автоматического макета, агент потерпел крах


167

Я недавно обновился до Xcode 8, и у меня возникли проблемы с раскадровкой.

Если я открою проект и у меня не откроется раскадровка, он скомпилируется и будет работать нормально. Как только я открываю раскадровку, я получаю несколько ошибок об IB Designables, как показано ниже.

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

Эти представления являются единственными представлениями, которые используют пользовательские представления TextFieldEffectsи BEMCheckboxимпортированы с помощью Cocoapods.


Может быть, проверить хранилище для Pod, который вы используете, и посмотреть, распространена ли эта проблема среди других пользователей?
— Zolnoor

Любой соответствующий ответ на это?
— Мохсин Хубайб Ахмед

1
ребята, вы нашли какой-нибудь обходной путь?
— падение

Будьте осторожны, проблема может быть в том, что вам нужна сборка для встроенной библиотеки . в моем примере у меня был встроен Swifter. Естественно, вы держите под рукой полную сборку (для разработки - симулятор / телефон) и сборку только для телефона (для магазина приложений, только для телефона) и просто переключаетесь на телефонную единственную, когда необходимо отправить ее в TestFlight и т. Д. в проекте была только телефонная библиотека !!!!! Doh! Обмен на «правильный» жир на исправил проблему.
— Толстяк

Ответы:


179

Вы можете попробовать одно из следующих действий, чтобы выяснить причину:

  1. найдите IBDesignablesAgentCocoaTouchжурналы в этом каталоге: ~/Library/Logs/DiagnosticReportsи посмотрите причину.

Примечание: для пользователя с Каталиной: ищите IBDesignablesAgent-iOS_<DATE>-<MAC_NAME>.crash

  1. Перейдите в Editor -> Debug Selected View при выборе @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

2
Это исправило мою проблему, но мне пришлось выйти из xCode, прежде чем удалять производные данные
— Husam

2
лучший ответ init (frame :) является распространенной проблемой
— Михал Зиобро

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 и попробуйте снова.


Спасибо за публикацию. Я произвел удаление производных данных из командной строки «старой школы», но проблема осталась. Использование вашего метода решило проблему для меня.
— Адриан

Обнови все взгляды на победу и для меня. Спасибо!
— Майк К.

56

Я просто удаляю неуспешный вид и нажимаю команду + Z, чтобы отменить удаление. Меня устраивает.

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


6
Это смешно, но это сработало.
— Ансари

1
Потрясающие!! Работал для меня
— Нупур Шарма

1
Кто знает, что это может быть ответом. Это сработало, я до сих пор не могу поверить
— Асад Амоди

37

Я столкнулся с этой проблемой в CocoaPod 1.5.0. Решение состоит в том, чтобы переустановить модуль pod (установить модуль снова), как только появится эта ошибка, или вместо этого вы можете использовать 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/issues/201#issuecomment-381915911


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

4
Работал, 1.5.0 стручков.
— Андрей Ошев

3
он s work for me, you should add end` до последнего кода.
— Махди

1
У меня тоже сработало. Перепробовал все остальные предложения безуспешно. Протестировано с Pods 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.
— Карл Аптон

Хороший улов! Отредактировал мой ответ.
— Стелабурас

12

Если вы используете файл xib для пользовательского интерфейса. Попробуй это:

Меняться от

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

Для того, чтобы:

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

8

Попробуйте отключить «Использовать варианты признаков» (панель «Идентичность и тип») для любого файла XIB, который может иметься для пользовательских представлений, используемых в вашей раскадровке.


7

Моя проблема была решена путем удаления папок (которые связаны с этим проектом) из папки производных данных. Вы можете сделать это, щелкнув Файл -> Настройка проекта ->, затем щелкните знак стрелки и /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 и рисует пользовательский интерфейс во время выполнения и сталкивается с механизмом Autolayout. Попробуйте задать фиксированную ширину или высоту для этих пользовательских видов. Если это не решит вашу проблему, попробуйте следующие решения: -

Решение 1: - Раскомментируйте #use_frameworks внутри вашего файла pod.

Решение 2: - Попробуйте удалить производные данные

  1. Закройте окно редактора вашего Xcode и выйдите из симулятора ->
  2. Перейдите в «Настройки XCode» -> «Местоположения» ->
  3. Нажмите маленькую серую стрелку, показывающую путь к производным данным ->
  4. Выберите свой проект ->
  5. Удалить все папки внутри ->
  6. Выйдите из Xcode и снова откройте

1
Не могли бы вы уточнить, как это на самом деле решает проблему?
— Паула Хассентойфель

это решило проблему, но до сих пор не знаю, почему uncoment, что use_frameworks, потому что это для быстрого проекта правильно
— Abhishek

Мой Podfile уже использует фреймворки, какие-нибудь предложения, которые не комментировали?
— mmr118

@ moni15 я добавил еще одно возможное решение. Пожалуйста, проверьте.
— Ашиш Писей

Раскомментирование #use_frameworks в файле pod и очистка DerivedData работали для меня.
— Джугал Десаи

2

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

Я решил попробовать закомментировать мое расширение IBDesignable для UIView, и оно сразу решило проблему. Итак, чтобы исправить это, найдите расширение, вызывающее проблему, и убедитесь, что настроили требуемые начальные единицы, создав класс 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 () в вашей реализации prepareForInterfaceBuilder ().
— Хайме С

1

Столкнулся с той же ошибкой: при настройке UITextField и использовании конструктора интерфейса, ошибка в консоли была -Использование нереализованного инициализатора 'init (frame :)' для класса "CustomField"

Добавлен инициализатор для исправления ошибки


1

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


0

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


0

В моем случае я использовал библиотеку, которая создавала подклассы UIView. Он использовал IB_DESIGNABLEи пропустил звонок[super awakeFromNib] . Как только я добавил вызов к этому методу, ошибка исчезла.

Я не уверен, IB_DESIGNABLEповлиял ли на это тот факт, что это осуществлялось .


Где вы добавили код для [супер 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/issues/5334.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.