39

Swiftで[self.view recursiveDescription]を使用する方法はありますか? この方法を使用しようとしていますが、次のエラーが発生します。

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

助言がありますか?

4

8 に答える 8

89

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 では、このビュー デバッガーが拡張され、関連するビュー コントローラーも含まれるようになりました。

ここに画像の説明を入力

于 2015-02-20T15:23:34.787 に答える
67

Swift 2.0 では、次のように実行できます。

po view.performSelector("recursiveDescription")

(iOS10 Beta3でテスト済み)swift 3.0では、これはもう少し複雑です:

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

于 2015-09-30T15:56:36.263 に答える
31
po view.value(forKey: "recursiveDescription")!
于 2016-12-05T16:13:07.270 に答える
11

Swift から非公開/文書化されていない Objective-C API (-recursiveDescriptionメソッド onなどUIView) にアクセスするには、次のようにします。

  1. プライベート メソッドが定義されているクラスに新しい Objective-C カテゴリを作成します (例: UIView)。
  2. Xcodeがブリッジング ヘッダーの設定について尋ねてきた場合は、[はい] をクリックします。(プロジェクトに既にブリッジ ヘッダーがある場合、この手順はスキップされます)。
  3. カテゴリの実装ファイル (.m) は削除できます。
  4. カテゴリ ヘッダーでプライベート メソッドを宣言します。

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

これで、ブレークポイントを設定して、LLDB で再帰的な説明を出力できます。

po view.recursiveDescription() as NSString
于 2014-12-29T19:03:33.727 に答える
10

最初に、ブリッジ ヘッダー@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

于 2015-01-21T08:51:14.340 に答える
2

そのメソッドで UIView のカテゴリの宣言をブリッジング ヘッダーに追加します。

于 2014-09-18T01:39:10.197 に答える