Xcode - можно ли отлаживать сбои в процессе Live Builder интерфейса Builder (IBDesignable)?
Вопрос
Можно ли установить контрольные точки и код отладки, выполненные с помощью Xcode/Interface Builder Live Rendering? То есть я использую атрибуты IBDesignable и IBInspectable, чтобы повлиять на представление, поскольку оно отображается в раскадровке построителя интерфейса, и хотел бы иметь возможность отлаживать ошибки "IB crashed". Я не помню это из сессии WWDC, кроме раздела о подготовкеForInterfaceBuilder.
Контекст
Недавно я начал видеть ряд ошибок, сообщающих, что IB разбился при попытке сделать мой код. Я в конечном счете проследил его до другой невиновной строки кода в layoutSubviews в одном из моих представлений, который был связан с раскадровкой. Конкретная проблема IB - при рендеринге живых представлений, называемая layoutSubviews, перед установкой всех свойств представления дочернего представления (что само по себе представляет собой отдельную проблему). Это контрастировало с симулятором и устройством, в котором представления были установлены перед первым вызовом layoutSubviews. Короче говоря, это связано с тем, что у него было множество файлов, чтобы найти оскорбительные изменения. Достаточно сказать, что я мог бы найти проблему быстро, если бы можно было установить точки останова и ловушку крушения.
Кто-нибудь понял, как отлаживать и/или вообще ловить эти проблемы, или же доступ еще не доступен?
Ответы
Ответ 1
Я снова посмотрел видео WWDC (§411 @22:00 или около того). Ты должен
- отредактируйте представление в IB и установите его пользовательский класс для класса в вашей кодовой базе
- установить точки останова по желанию в вашем пользовательском классе
- выберите представление в IB, затем выберите "Редактор" → "Отладка выбранных представлений" (внизу)
Как ни странно, в моих сегодняшних тестах он создает мое представление с помощью (initWith) Frame вместо (initWith) Coder. Это приводит к сбою логики последующего конфигурирования ограничений, так как вложенные представления не были установлены (как они были бы вызваны withCoder).
Ответ 2
(примечание к инструментам: Xcode 8.2, macOS Sierra)
У меня был совсем другой провал, чем у вас: у меня произошел сбой кода, в результате чего произошла ошибка IB в Xcode:
error: IB Designables: не удалось обновить статус автоматического макета: агент разбился
Чтобы отладить это на macOS Sierra, откройте Console.app и откройте "Отчеты пользователей" на правой боковой панели. Найдите сбой "IBDesignablesCocoaTouch *" и выберите соответствующий. Это дало мне информацию о кодовом уровне, которую мне нужно было диагностировать.
Crashed Thread: 0
Exception Type: EXC_BAD_INSTRUCTION (SIGILL)
Exception Codes: 0x0000000000000001, 0x0000000000000000
Exception Note: EXC_CORPSE_NOTIFY
Termination Signal: Illegal instruction: 4
Termination Reason: Namespace SIGNAL, Code 0x4
Terminating Process: exc handler [0]
Application Specific Information:
CoreSimulator 375.21 - Device: IBSimDeviceTypeiPad2x - Runtime: iOS 10.3 (14E8301) - DeviceType: IBSimDeviceTypeiPad2x
Thread 0 Crashed:
0 libswiftUIKit.dylib 0x000000021a2ddead _TToFE5UIKitCSo7UIImagecfT24imageLiteralResourceNameSS_S0_ + 205
1 libswiftUIKit.dylib 0x000000021a2ddcef _TFE5UIKitCSo7UIImageCfT24imageLiteralResourceNameSS_S0_ + 79
2 com.company.App 0x0000000216df74ad _TZFC10App21ControlsP33_F7118662B6663018C7DD0DEBB6FDD87511buttonImagefT8forStateOS_25State_CSo7UIImage + 109 (Controls.swift:121)
…
(В моем случае интерфейс Builder не смог загрузить литерал изображения. Мне пришлось реализовать этот обходной путь: xcode 6 IB_DESIGNABLE - не загружать ресурсы из пакета в Interface builder)