RecursiveDescription метод в Swift?
Есть ли способ использовать [self.view recursiveDescription] в Swift? Я пытаюсь использовать этот метод, но я получаю следующую ошибку:
'UIView' does not have a member named 'recursiveDescription'
Любые предложения?
Ответы
Ответ 1
Чтобы получить доступ к закрытому/недокументированному API Objective-C (например, метод -recursiveDescription
на UIView
) из Swift, вы можете сделать следующее:
Теперь вы можете установить точку останова и распечатать рекурсивное описание в LLDB:
po view.recursiveDescription() as NSString
Ответ 2
Если вы хотите отобразить иерархию представлений в 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 они расширили этот отладчик вида, поэтому теперь он включает в себя соответствующие контроллеры представлений:
![введите описание изображения здесь]()
Ответ 3
В swift 2.0 вы можете просто запустить:
po view.performSelector("recursiveDescription")
В (протестировано с iOS10 Beta3) swift 3.0 это немного сложнее:
po let s = view.perform("recursiveDescription"); print(s)
Ответ 4
Сначала добавьте категорию @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
Ответ 5
po view.value(forKey: "recursiveDescription")!
Ответ 6
Добавьте к заголовку моста объявление категории UIView с этим методом.