Bagaimana cara memeriksa hierarki tampilan di iOS?

170

Apakah ada alat GUI yang memeriksa hierarki tampilan aplikasi iOS? Saya sedang berpikir tentang inspektur web Webkit atau alat serupa. Saya mencari untuk men-debug masalah tata letak, seperti tampilan yang posisi atau ukurannya salah, atau seorang anak tidak terkandung dengan benar di induknya. Saat ini saya harus menambahkan pernyataan yang menguji berbagai kondisi ini dengan tangan, atau mengatur warna latar belakang yang berbeda pada tampilan yang berbeda, dan seperti yang dapat Anda bayangkan, itu adalah cara yang sangat membosankan untuk dilakukan.

Saya melihat Instrumen UI recorder, tetapi hanya merekam dan memutar tindakan UI` dan, dalam hal apa pun, hanya berfungsi untuk aplikasi Mac.

Apakah ada solusi yang lebih baik?

Vaddadi Kartick
sumber

Jawaban:

168

Xcode 6 sekarang memiliki inspeksi hierarki tampilan 3D bawaan seperti Reveal App dan Spark Inspector.

masukkan deskripsi gambar di sini

Klik tombol "Debug View Hierarchy" saat aplikasi Anda berjalan untuk menghentikan sementara eksekusi dan memeriksa tampilan pada saat ini.

masukkan deskripsi gambar di sini

Info lebih lanjut di dokumentasi Apple .

Levi McCallum
sumber
5
Jika opsi tampilan debugging tidak tersedia, lihat stackoverflow.com/questions/24040322/… .
kennytm
Pada awalnya, saya tidak melihat bilah alat yang ditunjukkan oleh Levi McCallum karena berada di bagian paling bawah jendela Xcode jika aplikasi tidak memiliki hasil debug. Dan setelah tombol ditekan, jendela View Hierarchy kosong sampai saya menekan salah satu tombol di bagian bawah, atau menyesuaikan salah satu bilah geser.
Carl Smith
Setelah Anda mulai bergantung pada alat ini, ia selalu hancur. Saya tidak tahu mengapa atau bagaimana cara memperbaikinya tetapi tampaknya terjadi pada pandangan yang lebih rumit.
Departamento B
263

Saya tidak tahu apakah ada alat inspeksi tampilan GUI, tapi saya beruntung dengan metode debugging di UIView: -recursiveDescription

jika Anda menjeda program dalam debugger dan memasukkannya ke GDB (Edit: juga berfungsi di LLDB)

po [[UIWindow keyWindow] recursiveDescription]

Anda mendapatkan cetakan dari seluruh hierarki tampilan Anda. Anda juga dapat menyebutnya pada tampilan tertentu untuk mendapatkan cetakan hierarki tampilan dari tampilan itu.

Mungkin sedikit membosankan untuk mengarungi info yang Anda dapatkan darinya, tetapi terbukti bermanfaat bagi saya.

Penghargaan diberikan kepada posting blog ini yang membahas tentang metode ini dan juga terkait dengan ini, tetapi agak sulit untuk menemukan catatan teknologi Apple .

Simon Goldeen
sumber
1
Saya punya: error: tidak dapat menemukan deklarasi antarmuka untuk '$ __ lldb_objc_class' ada ide? (lldb) po [[UIWindow keyWindow] recursiveDescription] error: tidak dapat menemukan deklarasi antarmuka untuk kesalahan '$ __ lldb_objc_class': tidak dapat menemukan deklarasi antarmuka untuk kesalahan '$ __ lldb_objc_class': 2 kesalahan penguraian ekspresi
Zennichimaro
1
Saya percaya jawaban ini bukan lagi jawaban kanonik, karena sekarang ada alat GUI yang tersedia yang langsung menjawab pertanyaan 'Apakah ada alat GUI ...?'
ada
dimulai dengan xcode 5.1 Saya mulai mendapatkan kesalahan ini setiap kali saya mengetik kesalahan recursiveDescription: metode instance 'undoManager' memiliki tipe hasil yang tidak kompatibel di unit terjemahan yang berbeda ('id' vs 'NSUndoManager *') catatan: metode instance 'undoManager' juga menyatakan di sini kesalahan : 1 kesalahan penguraian ekspresi
abbood
1
Sementara pertanyaannya sudah lama, dan bertanya tentang metode grafis, jawaban spesifik ini berkaitan dengan solusi tekstual. Diskusi tentang solusi dalam kode kanonik dapat ditemukan misalnya di sini: stackoverflow.com/a/14193682/2431627 . yaitu menggunakan properti _printHierarchy via KVC.
Robin Macharg
46

Buka tangkapan layar aplikasi

Anehnya, sekarang ada opsi lain, http://revealapp.com/ , yang pada pos ini masih dalam versi beta (gratis) terbuka. Seperti yang Anda lihat itu adalah inspektur visual lain.

EDIT 2014-04-05: Ungkap keluar dari Beta dan tidak lagi gratis. Namun, ada uji coba 30 hari.

livingtech
sumber
1
Saya sudah mencoba beberapa alat untuk ini (Spark Inspector, iOS Hierarchy Viewer dan tampilan seperti-firebug di alat pengujian Frank). Sejauh ini Reveal adalah favorit saya.
Stew
1
Tapi BENAR-BENAR masih sepadan. Jauh lebih baik daripada alat Xcode bawaan untuk melihat tampilan
Will Larche
35

Pertanyaan ini sudah lama, tetapi izinkan saya menaruh info di sini tentang alat baru yang saya kembangkan: https://github.com/glock45/iOS-Hierarchy-Viewer masukkan deskripsi gambar di sini

Damian Kołakowski
sumber
apakah mungkin untuk me-refresh halaman secara otomatis ketika saya menavigasi ke tampilan lain di simulator? lebih jauh lagi, apakah mungkin untuk mengubah nilai di penampil ini (jadi saya bisa melakukan beberapa tes pada browser tanpa menulis kode nyata)? terima kasih :)
Brian
1
@Brian terima kasih Brain. Saya mulai membuat prototipe kemungkinan untuk mengubah nilai. Dimatikan dalam rilis resmi. Tetap disini !
Damian Kołakowski
Terima kasih banyak atas sarannya. Saya berhasil memecahkan masalah saya dengan alat ini, masalah yang tidak dapat diselesaikan dengan menggunakan debugger UI Xcode!
D6mi
Terima kasih, Damian, tetapi bagi orang yang membaca ini, alat ini tampaknya tidak terawat.
Vaddadi Kartick
17

masukkan deskripsi gambar di sini

Untuk menjaga agar utas ini tetap terbaru, saya baru-baru ini bermain dengan Inspektur Spark . Ini tidak gratis, tetapi sangat bagus.

livingtech
sumber
7

The FLEX Debugger menyediakan dalam aplikasi tampilan inspektur yang memungkinkan Anda untuk memodifikasi UI dalam aplikasi berjalan. Ini juga mencatat permintaan jaringan.

https://github.com/Flipboard/FLEX

masukkan deskripsi gambar di sini

Scott Bossak
sumber
6

Gratis: Ketik saja ini di inspektur:

po [[UIWindow keyWindow] recursiveDescription]

Komersial: http://revealapp.com/ Saya menguji versi beta dari expressapp, itu bagus meskipun memiliki bug. Alat Komersial lain: http://sparkinspector.com/ itu berfungsi dengan mulus.

AVEbrahimi
sumber
Spark Inspector memiliki penampil notifikasi yang bagus
thierryb
6

Cepat 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"))))
   }
}

Penggunaan (dalam debugger): po myView.dump()

Vlad
sumber
2

Ini membuang semua di jendela debug. (Sulit untuk membaca tho) :( Bekerja di iOS 10, Xcode 8.3.3

po UIApplication.shared.keyWindow?.recursiveDescription()
Alix
sumber
0

Jawaban yang disetujui tidak lagi berfungsi untuk saya, menggunakan Xcode 8 dan Swift 2.3. Inilah yang bekerja untuk saya:

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

mph
sumber
1
Terima kasih, mph, tetapi ini tidak berfungsi dengan baik di Swift 3: error: properti 'shared' tidak ditemukan pada objek tipe 'UIApplication'
Vaddadi Kartick
Swift 4 dan Xcode 9.1 mengeluh dengan "error: <EXPR>: 3: 32: error: tidak dapat memanggil nilai dari tipe non-fungsi 'UIApplication' UIApplication. SharedApplication (). KeyWindow? .RecursiveDescription ()"
Jason Harrison