Подтвердить что ты не робот

Xcode - можно ли отлаживать сбои в процессе Live Builder интерфейса Builder (IBDesignable)?

Вопрос

Можно ли установить контрольные точки и код отладки, выполненные с помощью Xcode/Interface Builder Live Rendering? То есть я использую атрибуты IBDesignable и IBInspectable, чтобы повлиять на представление, поскольку оно отображается в раскадровке построителя интерфейса, и хотел бы иметь возможность отлаживать ошибки "IB crashed". Я не помню это из сессии WWDC, кроме раздела о подготовкеForInterfaceBuilder.

Контекст

Недавно я начал видеть ряд ошибок, сообщающих, что IB разбился при попытке сделать мой код. Я в конечном счете проследил его до другой невиновной строки кода в layoutSubviews в одном из моих представлений, который был связан с раскадровкой. Конкретная проблема IB - при рендеринге живых представлений, называемая layoutSubviews, перед установкой всех свойств представления дочернего представления (что само по себе представляет собой отдельную проблему). Это контрастировало с симулятором и устройством, в котором представления были установлены перед первым вызовом layoutSubviews. Короче говоря, это связано с тем, что у него было множество файлов, чтобы найти оскорбительные изменения. Достаточно сказать, что я мог бы найти проблему быстро, если бы можно было установить точки останова и ловушку крушения.

Кто-нибудь понял, как отлаживать и/или вообще ловить эти проблемы, или же доступ еще не доступен?

4b9b3361

Ответ 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)