Wie überprüfe ich die Ansichtshierarchie in iOS?

170

Gibt es ein GUI-Tool, das die Ansichtshierarchie einer iOS-App überprüft? Ich denke an Webkits Web Inspector oder ähnliche Tools. Ich möchte Layoutprobleme beheben, z. B. Ansichten mit falscher Position oder Größe oder ein Kind, das nicht ordnungsgemäß in seinem übergeordneten Element enthalten ist. Derzeit muss ich Asserts hinzufügen, die diese verschiedenen Bedingungen von Hand testen oder unterschiedliche Hintergrundfarben für unterschiedliche Ansichten festlegen. Wie Sie sich vorstellen können, ist dies ein sehr langwieriger Weg.

Ich habe mir Instruments angesehen UI recorder, aber das zeichnet nur UI-Aktionen auf und spielt sie ab. Auf jeden Fall funktioniert es nur für Mac-Apps.

Gibt es eine bessere Lösung?

Vaddadi Kartick
quelle

Antworten:

168

In Xcode 6 ist jetzt eine 3D-Ansichtshierarchieinspektion wie Reveal App und Spark Inspector integriert.

Geben Sie hier die Bildbeschreibung ein

Klicken Sie auf die Schaltfläche "Debug View Hierarchy", während Ihre App ausgeführt wird, um die Ausführung anzuhalten und die Ansichten im aktuellen Moment zu überprüfen.

Geben Sie hier die Bildbeschreibung ein

Weitere Informationen finden Sie in der Apple-Dokumentation .

Levi McCallum
quelle
5
Wenn die Option zum Debuggen von Ansichten nicht verfügbar ist, lesen Sie stackoverflow.com/questions/24040322/… .
Kennytm
Zuerst habe ich die von Levi McCallum angezeigte Symbolleiste nicht gesehen, da sie sich ganz unten im Xcode-Fenster befindet, wenn die App keine Debug-Ausgabe hat. Und sobald die Schaltfläche gedrückt wurde, war das Fenster Ansichtshierarchie leer, bis ich eine der Schaltflächen unten drückte oder einen der Schieberegler anpasste.
Carl Smith
Sobald Sie sich auf dieses Tool verlassen, ist es immer kaputt. Ich weiß nicht warum oder wie ich es beheben soll, aber es scheint bei komplizierteren Ansichten zu passieren.
Departamento B
263

Ich weiß nicht, ob es ein Tool zur Überprüfung der GUI-Ansicht gibt, aber ich hatte etwas Glück mit der Debugging-Methode in UIView: -recursiveDescription

wenn Sie das Programm im Debugger anhalten und in GDB eingeben (Bearbeiten: funktioniert auch in LLDB)

po [[UIWindow keyWindow] recursiveDescription]

Sie erhalten einen Ausdruck Ihrer gesamten Ansichtshierarchie. Sie können es auch in einer bestimmten Ansicht aufrufen, um einen Ausdruck der Ansichtshierarchie dieser Ansicht zu erhalten.

Es kann ein wenig langweilig sein, durch die Informationen zu waten, die Sie daraus erhalten, aber es hat sich für mich als nützlich erwiesen.

Dank geht an diesen Blog-Beitrag, der über diese Methode sprach und auch mit diesem hilfreichen, aber ziemlich schwer zu findenden technischen Hinweis von Apple verknüpft war .

Simon Goldeen
quelle
1
Ich habe: Fehler: Kann keine Schnittstellendeklaration für '$ __ lldb_objc_class' gefunden werden? (lldb) po [[UIWindow keyWindow] recursiveDescription] Fehler: Schnittstellendeklaration für '$ __ lldb_objc_class' kann nicht gefunden werden Fehler: Schnittstellendeklaration für '$ __ lldb_objc_class' kann nicht gefunden werden Fehler: 2 Fehler beim Analysieren des Ausdrucks
Zennichimaro
1
Ich glaube, diese Antwort ist nicht mehr die kanonische Antwort, da jetzt GUI-Tools verfügbar sind, die die Frage "Gibt es ein GUI-Tool ...?" Direkt beantworten.
Theraven
Beginnend mit xcode 5.1 Ich habe diesen Fehler immer dann erhalten, wenn ich den Fehler recursiveDescription eingebe: Die Instanzmethode 'undoManager' hat inkompatible Ergebnistypen in verschiedenen Übersetzungseinheiten ('id' vs. 'NSUndoManager *'). Hinweis: Die Instanzmethode 'undoManager' hat hier ebenfalls den Fehler deklariert : 1 Fehler beim Parsen des Ausdrucks
Abbood
1
Während die Frage alt ist und nach grafischen Methoden fragt, bezieht sich diese spezifische Antwort auf Textlösungen. Eine Diskussion der kanonischen In-Code-Lösung finden Sie zB hier: stackoverflow.com/a/14193682/2431627 . dh Verwenden der Eigenschaft _printHierarchy über KVC.
Robin Macharg
46

App-Screenshot anzeigen

Seltsamerweise gibt es jetzt eine andere Option, http://revealapp.com/ , die sich ab diesem Beitrag in einer offenen (kostenlosen) Beta befindet. Wie Sie sehen können, handelt es sich um einen weiteren visuellen Inspektor.

EDIT 2014-04-05: Reveal ist aus der Beta und nicht mehr kostenlos. Es gibt jedoch eine 30-Tage-Testversion.

livingtech
quelle
1
Ich habe einige Tools dafür ausprobiert (Spark Inspector, iOS Hierarchy Viewer und die Firebug-ähnliche Ansicht im Frank-Testtool). Bisher ist Reveal mein Favorit.
Eintopf
1
Aber es lohnt sich trotzdem. Viel besser als die eingebauten Xcode-Tools zum Anzeigen von Ansichten
Will Larche
35

Diese Frage ist alt, aber lassen Sie mich hier Informationen über das neue Tool einfügen, das ich entwickle: https://github.com/glock45/iOS-Hierarchy-Viewer Geben Sie hier die Bildbeschreibung ein

Damian Kołakowski
quelle
Ist es möglich, die Seite automatisch zu aktualisieren, wenn ich zu einer anderen Ansicht im Simulator navigiere? Ist es außerdem möglich, Werte in diesem Viewer zu ändern (damit ich einige Tests im Browser durchführen kann, ohne echten Code zu schreiben)? danke :)
Brian
1
@ Brian danke Brain. Ich fing an, die Möglichkeit, Werte zu ändern, zu prototypisieren. Es ist in der offiziellen Version ausgeschaltet. Bleib dran !
Damian Kołakowski
Vielen Dank für den Vorschlag. Ich habe es geschafft, mein Problem mit diesem Tool zu lösen, ein Problem, das mit dem UI-Debugger von Xcode nicht behoben werden konnte!
D6mi
Danke, Damian, aber für Leute, die dies lesen, scheint dieses Tool nicht gewartet zu werden.
Vaddadi Kartick
17

Geben Sie hier die Bildbeschreibung ein

Um diesen Thread auf dem neuesten Stand zu halten, habe ich kürzlich mit Spark Inspector gespielt . Es ist nicht kostenlos, aber es ist sehr schön.

livingtech
quelle
7

Der FLEX-Debugger bietet einen Inspektor für die Ansicht in der App, mit dem Sie die Benutzeroberfläche in einer laufenden App ändern können. Es protokolliert auch Netzwerkanforderungen.

https://github.com/Flipboard/FLEX

Geben Sie hier die Bildbeschreibung ein

Scott Bossak
quelle
6

Kostenlos: Geben Sie dies einfach in Inspector ein:

po [[UIWindow keyWindow] recursiveDescription]

Kommerziell: http://revealapp.com/ Ich habe die Beta-Version von enthüllenapp getestet, es war gut, hat aber Fehler. Ein weiteres kommerzielles Tool: http://sparkinspector.com/ Es funktioniert nahtlos.

AVEbrahimi
quelle
Spark Inspector hat einen netten Benachrichtigungs-Viewer
Thierryb
6

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

Verwendung (im Debugger): po myView.dump()

Vlad
quelle
2

Dies gibt alles im Debug-Fenster aus. (Schwer zu lesen) :( Arbeiten unter iOS 10, Xcode 8.3.3

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

Die genehmigte Antwort funktioniert bei mir mit Xcode 8 und Swift 2.3 nicht mehr . Folgendes funktioniert bei mir:

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

mph
quelle
1
Danke, mph, aber das funktioniert auch nicht in Swift 3: Fehler: Eigenschaft 'shared' wurde nicht für Objekt vom Typ 'UIApplication' gefunden
Vaddadi Kartick
Swift 4 und Xcode 9.1 beschweren sich mit "Fehler: <EXPR>: 3: 32: Fehler: Wert des Nichtfunktionstyps 'UIApplication' kann nicht aufgerufen werden. UIApplication.sharedApplication (). KeyWindow? .RecursiveDescription ()"
Jason Harrison