2

-(void)delete: メソッドを実装しているので、Cocoa アプリで削除キーを処理できます。選択内容に応じて異なることを実行したい: テキストフィールドの場合、デフォルトの動作 (左側の文字を削除) が必要ですが、NSBrowser アイテムの場合は、アイテムを削除する必要があります。

ウィンドウにファーストレスポンダを要求し、そのファーストレスポンダが NSBrowser のポインタと等しいかどうかを確認すると思いましたが、一致しませんでした。デバッグすると、firstResponder が NSBrowserTableView のインスタンスを指していることがわかりましたが、ドキュメントでそれを見つけることができません。

それは何ですか?

また、firstResponder が特定の tableView であるかどうかを確認するには、他にどのようにテストすればよいでしょうか? (私は NSBrowser をサブクラス化することを考えましたが、サブクラス化を避ける傾向があり、2 番目に考えたのはタグを追加することでしたが、ブラウザ内のアイテムの 1 つが選択されています。)

考え?

4

2 に答える 2

4

実際、@trudyscousin は部分的にしか正しくありません。このクラスは間違いなくNSBrowser のサブクラスではありません。

NSBrowserTableView は、各列を表示するためにNSBrowserによって使用されるNSTableViewのプライベート サブクラスです。テーブル ビューが使用されているため、分岐イメージ (フォルダーの横に描かれた小さな矢印) を描画する別の場所があり、行の残りの部分は既定またはユーザー定義のセルによって描画されます。

考えてみれば、(ブラウザーではなく) テーブル ビューが最初のレスポンダーであることは実際には理にかなっています。これは、アクティブな列のテーブルがキーストロークへの応答で最初にクラックされ、NSBrowser が NSTableView に既に行われていることを実行させることができるためです。する方法を知っています。(たとえば、ユーザーが入力した文字に一致する最初の行にジャンプします。)

幸いなことに、NSBrowserTableView には、動作するブラウザへのポインタがあります。-(NSBrowser*)browserメソッドを介してこれにアクセスできます。この特定のケースでは、NSBrowser をサブクラス化しないことをお勧めします。これは、有用なことを行うには、NSBrowser のプライベートな実装に関する深い知識が必要になるためです。

于 2011-02-14T17:13:59.323 に答える
-1

非公開のため、ドキュメントには記載されていません。私の推測では、NSBrowser または NSTableView をインスタンス化すると、実際にはこのプライベート クラスのサブクラスがインスタンス化され、それ自体が NSControl のサブクラスになります (ドキュメントでは、NSBrowser と NSTableView の両方のスーパークラスである指摘されています)。 )。もう 1 つの例は、「NSCFString」として表される NSString です。これは、CFString と NSString が「無料でブリッジされている」という事実をほのめかしているからです。

これを好きなだけ塩の粒で受け取ってください。しかし、ファーストレスポンダへの洞察を得る方法は、コードに NSLog ステートメントを挿入し、それを超えてブレークし、ログに出力されたものを確認することです。ビューのタグを設定して、それをステートメントに表示できます。または、最初のレスポンダーのクラスを依頼することもできます

NSStringFromClass([myFirstResponder class]) 

そしてそれを表示します。

これが役に立ったことを願っています。

于 2010-12-11T17:37:36.120 に答える