Apple ha aggiunto un private helper _printHierarchy
in iOS8 che può essere utilizzato in consolle LLDB:Come utilizzare _printHierarchy nella console LLDB con Swift?
po [[[UIWindow keyWindow] rootViewController] _printHierarchy]
che stampa l'intera gerarchia View Controller in forma di testo.
Questo funziona solo se si esegue il debug di codice su Objective C. In Swift, tuttavia, questo non funziona:
(lldb) po [[[UIWindow keyWindow] rootViewController] _printHierarchy]
error: <EXPR>:1:13: error: expected ',' separator
[[[UIWindow keyWindow] rootViewController] _printHierarchy]
^
,
<EXPR>:1:24: error: expected ',' separator
[[[UIWindow keyWindow] rootViewController] _printHierarchy]
^
,
<EXPR>:1:44: error: expected ',' separator
[[[UIWindow keyWindow] rootViewController] _printHierarchy]
^
,
un uso equivalente a Swift non funziona neanche:
po UIApplication.sharedApplication().keyWindow!.rootViewController!._printHierarchy
finisce con un errore (probabilmente perché _printHierarchy
è una proprietà privata):
(lldb) po UIApplication.sharedApplication().keyWindow!.rootViewController!._printHierarchy()
error: <EXPR>:1:64: error: 'UIViewController' does not have a member named '_printHierarchy'
UIApplication.sharedApplication().keyWindow!.rootViewController!._printHierarchy
^~~~~~~~~~~~~~~~
La domanda è: come stampare la gerarchia del controller di visualizzazione in Swift? O c'è un modo per usare ObjC nella console LLDB anche nei progetti Swift?
Hmm, ho provato questo e Ho aggiornato i miei articoli su con un errore ottengo in console. –
@TomKraina Se si utilizza un punto di interruzione nel codice Swift, ci si trova in un frame Swift e quindi "po" si aspetta l'espressione Swift. Se, tuttavia, premete il pulsante di pausa mentre il programma Swift è in esecuzione (che è quello che sto facendo spesso), molto probabilmente non sarete in un frame Swift quando ottenete il prompt '(lldb)', e quindi l'espressione Objective-C va bene. Fortunatamente, se metti in pausa l'app in Swift frame, puoi comunque esplicitamente fornire l'opzione '--language' (o l'opzione' -l') per specificare che anche se sei nel frame Swift, che dovrebbe interpretare l'espressione Objective-C . Vedi la risposta rivista. – Rob
È fantastico! Non sapevo che puoi specificare una lingua in 'lldb'! –