Есть ли способ использовать [self.view recursiveDescription] в Swift? Я пытаюсь использовать этот метод, но я получаю следующую ошибку:
'UIView' does not have a member named 'recursiveDescription'
Любые предложения?
Есть ли способ использовать [self.view recursiveDescription] в Swift? Я пытаюсь использовать этот метод, но я получаю следующую ошибку:
'UIView' does not have a member named 'recursiveDescription'
Любые предложения?
Чтобы получить доступ к закрытому/недокументированному API Objective-C (например, метод -recursiveDescription
на UIView
) из Swift, вы можете сделать следующее:
UIView
).Объявить закрытый метод в заголовке категории:
// UIView+Debugging.h
@interface UIView (Debugging)
- (id)recursiveDescription;
@end
Теперь вы можете установить точку останова и распечатать рекурсивное описание в LLDB:
po view.recursiveDescription() as NSString
Если вы хотите отобразить иерархию представлений в lldb, вам не нужно добавлять какие-либо категории или мосты заголовков или что-то в этом роде. При отладке кода Objective-C обычно можно использовать следующую команду в приглашении (lldb)
:
po [[UIWindow keyWindow] recursiveDescription]
Если, однако, вы остановились в кадре Swift, lldb может ожидать выражение Swift. Вы можете, явным образом, сказать expr
(сокращение po
на самом деле вызывает expression
), на каком языке находится выражение:
expr -l objc++ -O -- [[UIWindow keyWindow] recursiveDescription]
Те же шаблоны возникают в iOS 8 при просмотре иерархии контроллера представления, используя:
po [UIViewController _printHierarchy]
или в рамке Swift:
expr -l objc++ -O -- [UIViewController _printHierarchy]
Стоит отметить, что Xcode 8 представил отладчик вида (нажмите ), предлагая более интерактивный способ анализа иерархии представлений, в значительной степени устраняя необходимость в LLDB recursiveDescription
иерархии представлений. Для получения дополнительной информации см. Видео WWDC 2016 Visual Debugging с Xcode. По общему признанию, иногда нам приходится возвращаться к методу recursiveDescription
, показанному выше, но большую часть времени отладчик представления делает это гораздо более естественным, интуитивным процессом.
И в Xcode 9 они расширили этот отладчик вида, поэтому теперь он включает в себя соответствующие контроллеры представлений:
В swift 2.0 вы можете просто запустить:
po view.performSelector("recursiveDescription")
В (протестировано с iOS10 Beta3) swift 3.0 это немного сложнее:
po let s = view.perform("recursiveDescription"); print(s)
Сначала добавьте категорию @interface
без @implementation
в заголовок моста.
@interface UIView (Debug)
- (id)recursiveDescription;
- (id)_autolayoutTrace; // This one is even sweeter
@end
затем в консоли
po self.recursiveDescription() as NSString
po self._autolayoutTrace() as NSString
Ключ здесь as NSString
not as String
po view.value(forKey: "recursiveDescription")!
Добавьте к заголовку моста объявление категории UIView с этим методом.