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?

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 .


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 .


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.


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


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



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.


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()


2

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

po UIApplication.shared.keyWindow?.recursiveDescription()

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()


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.