Как проверить иерархию представления в iOS?


170

Существует ли инструмент с графическим интерфейсом, который проверяет иерархию представления приложения iOS? Я думаю о веб-инспекторе Webkit или подобных инструментах. Я пытаюсь отладить проблемы макета, такие как представления, имеющие неправильную позицию или размер, или дочерний элемент, который не содержится должным образом в его родительском элементе. В настоящее время я должен добавить утверждения, которые проверяют эти различные условия вручную, или устанавливать разные цвета фона для разных представлений, и, как вы можете себе представить, это действительно утомительный способ сделать это.

Я посмотрел на инструменты UI recorder, но он только записывает и воспроизводит действия пользовательского интерфейса и, в любом случае, работает только для приложений Mac.

Есть ли лучшее решение?

Ответы:


168

Xcode 6 теперь имеет встроенную проверку иерархии 3D-вида, такую ​​как Reveal App и Spark Inspector.

введите описание изображения здесь

Нажмите кнопку «Отладить иерархию представлений» во время работы приложения, чтобы приостановить выполнение и проверить представления в текущий момент.

введите описание изображения здесь

Больше информации в документации Apple .


5
Если опция отладки представления недоступна, см. Stackoverflow.com/questions/24040322/… .
Кеннитм

Сначала я не видел панель инструментов, показанную Леви МакКаллумом, потому что она находится в самом низу окна XCode, если приложение не имеет отладочной информации. И после нажатия кнопки окно View Hierarchy было пустым, пока я не нажал одну из кнопок внизу или не настроил один из ползунков.
Карл Смит

Как только вы начинаете полагаться на этот инструмент, он всегда исчезает. Я не знаю, почему или как это исправить, но, похоже, это происходит на более сложных взглядах.
Departamento B

263

Я не знаю, есть ли инструмент проверки представлений GUI, но мне повезло с методом отладки в UIView: -recursiveDescription

если вы приостановите программу в отладчике и введете ее в GDB (Edit: также работает в LLDB)

po [[UIWindow keyWindow] recursiveDescription]

Вы получаете распечатку всей иерархии представления. Вы также можете вызвать его для определенного представления, чтобы получить распечатку иерархии представления этого представления.

Может быть немного утомительно разбираться с информацией, которую вы получаете из нее, но она оказалась полезной для меня.

Авторы благодарны этой записи в блоге, в которой рассказывается об этом методе, а также содержится ссылка на этот полезный, но довольно трудный для поиска технический материал Apple .


1
Я получил: ошибка: не можете найти объявление интерфейса для '$ ​​__ lldb_objc_class' какие-либо идеи? (lldb) po [[UIWindow keyWindow] recursiveDescription] ошибка: не удается найти объявление интерфейса для ошибки '$ __ lldb_objc_class': не удается найти объявление интерфейса для ошибки '$ __ lldb_objc_class': 2 ошибки при разборе выражения
Zennichimaro

1
Я считаю, что этот ответ больше не является каноническим ответом, поскольку теперь доступны инструменты с графическим интерфейсом, которые прямо отвечают на вопрос «Есть ли инструмент с графическим интерфейсом ...?»
Теравен

начиная с xcode 5.1 я начинал получать эту ошибку всякий раз, когда набираю recursiveDescription error: метод экземпляра 'undoManager' имеет несовместимые типы результатов в разных единицах перевода ('id' против 'NSUndoManager *') примечание: метод экземпляра 'undoManager' также объявляет здесь ошибку : 1 ошибка при разборе выражения
abbood

1
Хотя вопрос старый и задает вопрос о графических методах, этот конкретный ответ относится к текстовым решениям. Обсуждение канонического решения в коде можно найти, например, здесь: stackoverflow.com/a/14193682/2431627 . т.е. используя свойство _printHierarchy через KVC.
Робин Мачарг,

46

Показать скриншот приложения

Как ни странно, теперь есть еще один вариант, http://revealapp.com/ , который на данный момент находится в открытой (бесплатной) бета-версии. Как видите, это еще один визуальный инспектор.

РЕДАКТИРОВАТЬ 2014-04-05: Reveal вышел из бета-версии и больше не является бесплатным. Однако существует 30-дневная пробная версия.


1
Я попробовал несколько инструментов для этого (Spark Inspector, iOS Hierarchy Viewer и представление, похожее на firebug в инструменте тестирования Frank). Пока что Reveal мой любимый.
Тушить

1
Но ПОЛНОСТЬЮ все еще стоит. Намного лучше, чем встроенные инструменты Xcode для просмотра представлений
Will Larche

35

Этот вопрос старый, но позвольте мне разместить здесь информацию о новом инструменте, который я разрабатываю: https://github.com/glock45/iOS-Hierarchy-Viewer введите описание изображения здесь


Можно ли обновить страницу автоматически при переходе к другому виду в симуляторе? Кроме того, возможно ли изменить значения в этом средстве просмотра (чтобы я мог выполнять некоторые тесты в браузере без написания реального кода)? спасибо :)
Брайан

1
@ Брайан, спасибо, Мозг. Я начал прототипировать возможность изменения значений. Это выключено в официальном релизе. Быть в курсе !
Дамиан Колаковский

Большое спасибо за предложение. Мне удалось решить эту проблему с помощью этого инструмента, проблему, которую не удалось решить с помощью отладчика пользовательского интерфейса Xcode!
D6mi

Спасибо, Дамиан, но для людей, читающих это, этот инструмент кажется не поддерживаемым.
Ваддади Картик

17

введите описание изображения здесь

Просто чтобы поддерживать актуальность этой темы, я недавно играл в Spark Inspector . Это не бесплатно, но очень приятно.



6

Бесплатно: просто введите это в инспекторе:

po [[UIWindow keyWindow] recursiveDescription]

Коммерческий: http://revealapp.com/ Я тестировал бета-версию раскрытия, это было хорошо, хотя есть ошибки. Другой коммерческий инструмент: http://sparkinspector.com/ работает без проблем.


Spark Inspector имеет приятную программу просмотра уведомлений
thierryb

6

Свифт 4.

iOS :

extension UIView {

   // Prints results of internal Apple API method `recursiveDescription` to console.
   public func dump() {
      Swift.print(perform(Selector(("recursiveDescription"))))
   }
}

macOS :

extension NSView {

   // Prints results of internal Apple API method `_subtreeDescription` to console.
   public func dump() {
      Swift.print(perform(Selector(("_subtreeDescription"))))
   }
}

Использование (в отладчике): po myView.dump()


2

Это сбрасывает все в окне отладки. (Трудно прочитать, хотя) :( Работа на iOS 10, Xcode 8.3.3

po UIApplication.shared.keyWindow?.recursiveDescription()

0

Утвержденный ответ больше не работает для меня, используя Xcode 8 и Swift 2.3. Вот что работает для меня:

po UIApplication.sharedApplication().keyWindow?.recursiveDescription()


1
Спасибо, миль / ч, но это не работает и в Swift 3: ошибка: свойство 'shared' не найдено для объекта типа 'UIApplication'
Vaddadi Kartick

Swift 4 и Xcode 9.1 жалуются на «error: <EXPR>: 3: 32: error: невозможно вызвать значение нефункционального типа« UIApplication »UIApplication.sharedApplication (). KeyWindow? .RecursiveDescription ()»
Джейсон Харрисон

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.