0

特定のプロパティが変更されるたびに特定のアクションを実行するためにキー値監視を使用しています (たとえば、フレームまたは境界が変更されるたびにカスタム UIView のサブビューを再レイアウトします)。誰が (つまり、どの関数が) この変更を引き起こしているかを確認する方法はありますか? 誰が変更を引き起こしたのか、またはそれが原因で KVO がトリガーされたのかobserveValueForKeyPath:ofObject:change:context:がわからないため、ブレークポイントを設定しても役に立ちません。framebounds

私の特定の例では、UIView のサイズを変更しているのは誰であるか、何が変更されているかわかりません。

編集#1:フレーム/境界が呼び出されたときに一時停止したスタックトレースのスクリーンショットobserveValue...

また、これはデバッグのみを目的としていることにも注意してください。

スタックトレース

4

1 に答える 1

0

一般に、いいえ、スタック トレースを見る以外に、特定の KVC ミューテーション (したがって KVO 通知) の原因を知ることはできません。この場合、-[UIView(Geometry) _applyAutoresizingMaskWithOldSuperviewSize]原因のように見えますが、より一般的には、通知をトリガーしているビューを解凍してレイアウトするプロセスであるように見えます。この変更はあなたのコードによるものではないため、どこから来たのかを知ることがどのように役立つかわかりません.

スタックの上位にある独自のコードからスタックの下位にある監視メソッドに「知識」を渡すためにプレイできるトリックがいくつかあります。フラグ/値[[NSThread currentThread] threadDictionary]をスタッシュして、オブザーバー メソッドでチェックすることができます (より高いスタック フレームが戻る前にフラグを明示的に削除することを忘れないでください)。コードが変更を直接トリガーしていない場合、このようなケースに関する情報は提供されません。

于 2013-06-18T12:45:59.700 に答える