2014-09-17 15 views
28

C'è un modo per usare [self.view recursiveDescription] in Swift? Sto cercando di utilizzare questo metodo, ma sto ricevendo il seguente errore:Metodo ricorsivoDescrizione in Swift?

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

Qualche suggerimento?

+2

FYI, Se si desidera utilizzare [self.view recursiveDescription] durante il debug di Swift o Obj-C, è possibile mettere in pausa l'app e po [self.view recursiveDescription]. [[UIWindow keyWindow] _autolayoutTrace] è ottimo per eseguire il debug dei vincoli di visualizzazione, specialmente in combinazione con il debugger visivo di XCode6. –

risposta

8

Per accedere privato/non documentate API Objective-C (come il metodo -recursiveDescription su UIView) da Swift è possibile effettuare le seguenti operazioni:

  1. creare una nuova categoria Objective-C sulla classe del metodo privato è definito in (es. UIView).
  2. Hit se Xcode richiede di configurare un'intestazione di collegamento. (Se hai già un'intestazione di bridging nel tuo progetto, questo passaggio verrà saltato).
  3. Il file di implementazione (.m) della categoria può essere rimosso.
  4. dichiarare il metodo privato nell'intestazione categoria:

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

Ora è possibile impostare un punto di interruzione e stampare la descrizione ricorsiva in LLDB:

po view.recursiveDescription() as NSString 
+1

questa tecnica funziona alla grande ma swift/lldb lo stanno facendo pasticci su. Non ho idea del perché, ma l'output che ottengo (XCode 6.2 6C101) da questa tecnica è orribilmente incasinato, include \ n come caratteri distinti quindi interruzioni di linea effettive nella console - che erano fantastiche - e clip a circa 1800 caratteri , rendendolo abbastanza inutile. ugh. – natbro

1

Aggiungere alla testata del bridging una dichiarazione di una categoria di UIView con tale metodo.

+0

Nel caso in cui un altro novizio come me abbia bisogno di ulteriori dettagli :) http://petosoft.wordpress.com/2014/06/13/lldb-and-xcode-6/ – iamdavidlam

6

Prima aggiungere una categoria @interface senza @implementation nell'intestazione del bridging.

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

poi nella vostra console

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

La chiave qui è as NSString non as String

+0

Come sapevi come cast NSString? – MattD

+1

All'inizio non lo sapevo. Appena provato e stanco – CopperCash

+0

Più uno per _autolayoutTrace. È * piuttosto dolce! –

72

Se si desidera visualizzare la gerarchia vista in lldb, non c'è bisogno di aggiungere qualsiasi categoria o colmando intestazioni o qualcosa del genere. Quando il debug di codice Objective-C, si potrebbe generalmente utilizzare il seguente comando al prompt (lldb):

po [[UIWindow keyWindow] recursiveDescription] 

Se, però, hai messo in pausa in una cornice Swift, lldb potrebbe aspettare un'espressione Swift.È possibile, però, dica esplicitamente expr (l'abbreviazione po è effettivamente chiamando expression), che la lingua l'espressione è in:

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

Gli stessi modelli si verificano in iOS 8, quando si visualizza la gerarchia View Controller, utilizzando :

po [UIViewController _printHierarchy] 

o, nel telaio Swift:

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

Vale la pena notare che Xcode 8 ha introdotto il debugger della vista (fare clic su view debug button), offrendo un modo più interattivo per analizzare la gerarchia della vista, eliminando in gran parte la necessità della LLDB recursiveDescription della gerarchia della vista. Per ulteriori informazioni, vedere il video WWDC 2016 Visual Debugging with Xcode. Certo, a volte finiamo per dover ricorrere alla tecnica recursiveDescription mostrata sopra, ma il più delle volte il debugger vista rende questo processo molto più naturale e intuitivo.

E in Xcode 9, hanno ampliato questo debugger vista in modo che ora include i controller di vista rilevanti, anche:

enter image description here

+2

La risposta di Ron è più semplice per Swift 2.0, ma è utile sapere lldb –

+0

Buone informazioni! Qualche idea per cui self non è disponibile quando si cambia la lingua in objc? Per esempio. se ho breakpoint all'interno di un metodo di istanza, "expr -l swift - print (self)" stampa correttamente una descrizione di self, mentre "expr -l objc - NSLog (@"% @ ", self)" si traduce in "uso dell'identificatore non dichiarato 'self' " –

+0

Nota, per metterti alla prova devi prima: expr -l objc - @import UIKit –

58

a Swift 2.0 è possibile eseguire semplicemente:

po view.performSelector("recursiveDescription") 

In (testato con iOS10 Beta3) swift 3.0 questo è un po 'più complesso:

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

+4

Questa dovrebbe essere la risposta accettata perché non richiede codice aggiuntivo. – user3246173

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