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.