Swiftで[self.view recursiveDescription]を使用する方法はありますか? この方法を使用しようとしていますが、次のエラーが発生します。
'UIView' does not have a member named 'recursiveDescription'
助言がありますか?
Swiftで[self.view recursiveDescription]を使用する方法はありますか? この方法を使用しようとしていますが、次のエラーが発生します。
'UIView' does not have a member named 'recursiveDescription'
助言がありますか?
lldb でビュー階層を表示する場合、カテゴリやブリッジ ヘッダーなどを追加する必要はありません。Objective-C コードをデバッグするときは、通常、(lldb)
プロンプトで次のコマンドを使用します。
po [[UIWindow keyWindow] recursiveDescription]
ただし、Swift フレームで一時停止した場合、lldb は Swift 式を期待する場合があります。ただし、式がどの言語で使用されているかを明示的に伝えることができますexpr
(po
省略形は実際には を呼び出しています)。expression
expr -l objc++ -O -- [[UIWindow keyWindow] recursiveDescription]
iOS 8 で、View Controller 階層を表示するときに、以下を使用して同じパターンが発生します。
po [UIViewController _printHierarchy]
または、Swift フレームでは:
expr -l objc++ -O -- [UIViewController _printHierarchy]
WWDC 2018 Advanced Debugging with Xcodeでは、次の行でテキスト ファイルを作成してexpr
エイリアスを定義することで、この複雑な構文から離れることを提案しています。poc
~/.lldbinit
command alias poc expression -l objc -O --
次に、次のようなことができます。
poc [UIViewController _printHierarchy]
Xcode 8 でビュー デバッガー ( をクリック) が導入され、ビュー階層を分析するためのよりインタラクティブな方法が提供され、ビュー階層の LLDB が大幅に不要になったことは注目に値し
recursiveDescription
ます。(これは、WWDC 2016 のビデオVisual Debugging with Xcode (現在は使用できません) で説明されています。確かに、上記の手法にフォールバックしなければならない場合もありrecursiveDescription
ますが、ほとんどの場合、ビュー デバッガーを使用すると、これがはるかに自然になります。 、直感的なプロセス。
Xcode 9 では、このビュー デバッガーが拡張され、関連するビュー コントローラーも含まれるようになりました。
Swift 2.0 では、次のように実行できます。
po view.performSelector("recursiveDescription")
(iOS10 Beta3でテスト済み)swift 3.0では、これはもう少し複雑です:
po let s = view.perform("recursiveDescription"); print(s)
po view.value(forKey: "recursiveDescription")!
Swift から非公開/文書化されていない Objective-C API (-recursiveDescription
メソッド onなどUIView
) にアクセスするには、次のようにします。
UIView
)。カテゴリ ヘッダーでプライベート メソッドを宣言します。
// UIView+Debugging.h
@interface UIView (Debugging)
- (id)recursiveDescription;
@end
これで、ブレークポイントを設定して、LLDB で再帰的な説明を出力できます。
po view.recursiveDescription() as NSString
最初に、ブリッジ ヘッダー@interface
なしでカテゴリを追加します。@implementation
@interface UIView (Debug)
- (id)recursiveDescription;
- (id)_autolayoutTrace; // This one is even sweeter
@end
次に、コンソールで
po self.recursiveDescription() as NSString
po self._autolayoutTrace() as NSString
ここでの鍵はそうではありas NSString
ませんas String
そのメソッドで UIView のカテゴリの宣言をブリッジング ヘッダーに追加します。