Як перевірити ієрархію перегляду в iOS?


170

Чи є інструмент GUI, який перевіряє ієрархію перегляду додатків для iOS? Я думаю про веб-інспектора Webkit або подібних інструментів. Я хочу виправити налагодження проблем із компонуванням, як-от неправильні положення чи розміри поглядів, або дитина не містить належним чином свого батька. На даний момент я маю додати твердження, які перевіряють ці різні умови вручну або встановлюють різні кольори фону на різних видах, і, як ви можете собі уявити, це дійсно нудний спосіб зробити це.

Я переглянув інструменти UI recorder, але це лише записує та відтворює дії інтерфейсу користувача, і, у будь-якому випадку, працює лише для додатків Mac.

Чи є краще рішення?

Відповіді:


168

Xcode 6 тепер має вбудовану 3D-ієрархічну перевірку, як-от Reveal App та Spark Inspector.

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

Натисніть кнопку "Ієрархія перегляду налагодження", поки програма працює, щоб призупинити виконання та перевірити представлення даних у поточний момент.

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

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


5
Якщо параметр налагодження перегляду недоступний, див. Stackoverflow.com/questions/24040322/… .
kennytm

Спочатку я не бачив панелі інструментів, яку показав Леві Маккаллум, тому що вона знаходиться в самому нижній частині вікна Xcode, якщо в додатку немає результату налагодження. І після натискання кнопки вікно «Ієрархія перегляду» порожнє, поки я не натиснув одну з кнопок у нижній частині або не відрегулював одну із повзунків.
Карл Сміт

Після того, як ви почнете покладатися на цей інструмент, він завжди проступає. Я не знаю, чому і як це виправити, але, здається, це трапляється на більш складних поглядах.
Департамент Б

263

Я не знаю, чи є інструмент перевірки перегляду графічного інтерфейсу, але мені пощастило з методом налагодження в UIView: -recursiveDescription

якщо ви призупинили програму в відладчику і введіть її в GDB (Правка: також працює в LLDB)

po [[UIWindow keyWindow] recursiveDescription]

Ви отримуєте роздруківку всієї ієрархії перегляду. Ви також можете викликати його на певному вікні, щоб отримати роздруківку ієрархії перегляду цього подання.

Це може бути трохи нудно перебирати інформацію, яку ви отримуєте з неї, але вона виявилася корисною для мене.

Кредит йде на цю публікацію в блозі, в якій розповідали про цей метод, а також пов’язану з цим корисним, але досить важко знайти технічну записку Apple .


1
У мене: помилка: не можете знайти декларацію інтерфейсу для '$ ​​__ lldb_objc_class' будь-яких ідей? (lldb) po [[UIWindow keyWindow] recursiveDescription] помилка: не вдається знайти декларацію інтерфейсу для помилки '$ __ lldb_objc_class': не вдалося знайти декларацію інтерфейсу для помилки '$ __ lldb_objc_class': 2 помилки розбору виразів
Zennichimaro

1
Я вважаю, що ця відповідь більше не є канонічною відповіддю, оскільки зараз є інструменти графічного інтерфейсу, які безпосередньо відповідають на питання "Чи є інструмент GUI ...?"
теравен

починаючи з xcode 5.1. Я почав отримувати цю помилку щоразу, коли я вводив рекурсивну помилку опису: метод екземпляра 'undoManager' має несумісні типи результатів у різних одиницях перекладу ('id' проти 'NSUndoManager *') Примітка: метод екземпляра 'undoManager' також оголосив тут помилку : 1 помилка розбору виразів
abbood

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

46

Показати скріншот програми

Як не дивно, тепер є ще один варіант, http://revealapp.com/ , який станом на цей пост знаходиться у відкритій (безкоштовній) бета-версії. Як бачите, це ще один візуальний інспектор.

EDIT 2014-04-05: Reveal не входить у версію бета-версії і більше не безкоштовний. Проте триває 30-денне випробування.


1
Я спробував кілька інструментів для цього (Spark Inspector, iOS Hierarchy Viewer та перегляд, подібний до firebug, у інструменті перевірки Франка). Поки Reveal - мій улюблений.
Тушковане

1
Але РАЗОМ все-таки варто. Набагато краще, ніж вбудовані інструменти Xcode для перегляду подань
Will Larche

35

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


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

1
@Brian дякую Мозок. Я почав прототипувати можливість змінити значення. Це вимкнено в офіційному релізі. Будьте в курсі!
Даміан Колоковський

Дякую за пропозицію. Мені вдалося вирішити свою проблему за допомогою цього інструменту - проблему, яку не вдалося вирішити за допомогою налагоджувача інтерфейсу користувача Xcode!
D6mi

Дякую, Даміане, але людям, які читають це, цей інструмент здається незмінним.
Ваддаді Картік

17

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

Просто для того, щоб цю тему оновлювати, я нещодавно грав із Spark Inspector . Це не безкоштовно, але це дуже приємно.



6

Безкоштовно: Просто введіть це в інспектор:

po [[UIWindow keyWindow] recursiveDescription]

Комерційний: http://revealapp.com/ Я тестував бета-версію revealapp, це було добре, хоча має помилки. Ще один комерційний інструмент: 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 скаржаться на "помилку: <EXPR>: 3: 32: помилка: не може викликати значення нефункціонального типу" UIApplication "UIApplication.sharedApplication (). KeyWindow? .RecursiveDescription ()"
Джейсон Харрісон

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.