Як перевірити ієрархію перегляду в 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.