2009-06-08 20 views
1

私はCocoaデスクトップアプリケーションを構築しています。 NSViewのisHiddenステータスが変更されたときを知りたい。これまでのところ、ターゲット/アクションを使用することは役に立たず、NSNotificationでこのタスクを見つけることができません。 setHiddenメソッドをオーバーライドしないようにしたいと思います。使用しているすべてのNSView派生クラスをオーバーライドする必要があるためです。NSViewの通知を取得するにはどうすればよいですか?

更新:私はKVOを使用して終了しました。 "isHidden"のパスは "hidden"です。おそらく、setterが "setHidden"であるためです。

答えて

3

Key-Value Observingを使用して、NSViewのisHiddenプロパティを観察できます。これらのビューのいずれかから変更通知を受け取ると、そのビューまたはスーパービューのいずれかが非表示になっているかどうかを-isHiddenOrHasHiddenAncestorで確認できます。

警告の言葉:キー値の観測権を取得することはややこしいです。マイケル・アッシュによる投稿thisの投稿、またはGoogle Toolbox for MacNSObject+KeyValueObservingカテゴリの-[NSObject gtm_addObserver:forKeyPath:selector:userInfo:options]メソッドの使用を強くお勧めします。

0

hiddenプロパティのセッターメソッドをオーバーライドして、アプリケーション内でカスタム通知をトリガーすることはできますか?

+0

私はこの方法を避けています。私はこの詳細を私の質問に追加するのを忘れていました。私に思い出させてくれてありがとう。 – phi

1

より一般的には、viewWillMoveToWindow:またはNSViewの他の関連するメソッドをオーバーライドして、ビューが実際に表示されるとき(つまり、ウィンドウがウィンドウの表示リストにあり、ビューが非表示になっていないとき)を通知できます。したがって、上記で使用された 'hidden'キーに対するKVOへの依存性は取り除かれます。これはsetIsHiddenがそのビューで呼び出された場合にのみ機能します。オーバーライドでは、 'window'(または[self window])は、ビューが可視のビュー階層に置かれているかどうかを示します(ウィンドウは非nilです)。

たとえば、コントロールが表示されている間だけ更新したいときに、オンラインデータからコントロールを定期的に更新するためにタイマを開始/停止するために使用します。

関連する問題