Frage rekursiveDescription-Methode in Swift?


Gibt es eine Möglichkeit, [Self.view rekursiveDescription] in Swift zu verwenden? Ich versuche diese Methode zu verwenden, aber ich erhalte den folgenden Fehler:

'UIView' does not have a member named 'recursiveDescription'

Irgendwelche Vorschläge?


29
2017-09-17 21:25


Ursprung


Antworten:


Um Zugriff auf private / undokumentierte Objective-C API (wie die -recursiveDescription Methode an UIView) von Swift können Sie Folgendes tun:

  1. Erstellen Sie eine neue Objective-C-Kategorie für die Klasse, in der die private Methode definiert ist (z. UIView).
  2. Schlagen Ja Wenn Sie von Xcode gefragt werden, ob ein Bridging-Header konfiguriert werden soll. (Wenn Sie in Ihrem Projekt bereits einen Bridging-Header haben, wird dieser Schritt übersprungen).
  3. Die Implementierungsdatei (.m) der Kategorie kann entfernt werden.
  4. Deklarieren Sie die private Methode in der Kategorieüberschrift:

    // UIView+Debugging.h
    
    @interface UIView (Debugging)
    - (id)recursiveDescription;
    @end
    

Jetzt können Sie einen Haltepunkt setzen und die rekursive Beschreibung in LLDB ausdrucken:

po view.recursiveDescription() as NSString

8
2017-12-29 19:03



Wenn Sie die Ansichtshierarchie in lldb anzeigen möchten, müssen Sie keine Kategorien oder Bridging-Header oder ähnliches hinzufügen. Beim Debuggen von Objective-C-Code würde man normalerweise den folgenden Befehl bei der (lldb) prompt:

po [[UIWindow keyWindow] recursiveDescription]

Wenn Sie jedoch in einem Swift-Frame pausiert haben, erwartet lldb möglicherweise einen Swift-Ausdruck. Sie können dies jedoch explizit mitteilen expr (das po Abkürzung ruft tatsächlich an expression) in welcher Sprache der Ausdruck ist:

expr -l objc++ -O -- [[UIWindow keyWindow] recursiveDescription]

Die gleichen Muster treten in iOS 8 auf, wenn Sie die View-Controller-Hierarchie mit den folgenden Elementen anzeigen:

po [UIViewController _printHierarchy]

oder im Swift-Frame:

expr -l objc++ -O -- [UIViewController _printHierarchy]

Es ist erwähnenswert, dass Xcode 8 den View Debugger eingeführt hat (klicken Sie auf view debug button), die eine interaktivere Möglichkeit bietet, die Ansichtshierarchie zu analysieren, wodurch die Notwendigkeit für die LLDB weitgehend eliminiert wird recursiveDescription der Sichthierarchie. Für weitere Informationen siehe Video der WWDC 2016 Visual Debugging mit Xcode. Zugegeben, manchmal enden wir damit, dass wir uns auf die recursiveDescription Technik, die oben gezeigt wird, aber die meiste Zeit der View-Debugger macht dies zu einem viel natürlicheren, intuitiveren Prozess.

Und in Xcode 9 haben sie diesen View-Debugger erweitert, so dass er jetzt auch die relevanten View-Controller enthält:

enter image description here


76
2018-02-20 15:23



In swift 2.0 können Sie einfach Folgendes ausführen:

po view.performSelector("recursiveDescription")

In (getestet mit iOS10 Beta3) swift 3.0 ist das etwas komplexer:

po let s = view.perform("recursiveDescription"); print(s)


61
2017-09-30 15:56



po view.value(forKey: "recursiveDescription")!

9
2017-12-05 16:13



Fügen Sie zuerst eine Kategorie hinzu @interface ohne @implementation in Ihrem Bridging-Header.

@interface UIView (Debug)
- (id)recursiveDescription;
- (id)_autolayoutTrace;  // This one is even sweeter
@end

dann in deiner Konsole

po self.recursiveDescription() as NSString
po self._autolayoutTrace() as NSString

Der Schlüssel hier ist as NSString nicht as String


6
2018-01-21 08:51



Fügen Sie dem Bridging-Header eine Deklaration einer Kategorie von UIView mit dieser Methode hinzu.


1
2017-09-18 01:39