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

RecursiveDescription метод в Swift?

Есть ли способ использовать [self.view recursiveDescription] в Swift? Я пытаюсь использовать этот метод, но я получаю следующую ошибку:

'UIView' does not have a member named 'recursiveDescription'

Любые предложения?

4b9b3361

Ответ 1

Чтобы получить доступ к закрытому/недокументированному API Objective-C (например, метод -recursiveDescription на UIView) из Swift, вы можете сделать следующее:

  • Создайте новую категорию Objective-C для класса, в котором частный метод определен (например, UIView).
  • Нажмите "Да", если Xcode спросит вас о настройке заголовка моста. (Если у вас уже есть заголовок моста в вашем проекте, этот шаг будет пропущен).
  • Файл реализации (.m) категории можно удалить.
  • Объявить закрытый метод в заголовке категории:

    // UIView+Debugging.h
    
    @interface UIView (Debugging)
    - (id)recursiveDescription;
    @end
    

Теперь вы можете установить точку останова и распечатать рекурсивное описание в 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 с этим методом.