Как проверить иерархию представления в 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.