NSTextView で主要なイベントをキャプチャする最良の方法は?
-
08-06-2019 - |
質問
私は Objective-C と Cocoa をゆっくりと学んでいます。これまでのところ、テキスト ビューで主要なイベントをキャプチャする唯一の方法は委任を使用することですが、そのようなソリューションを実装する方法に関する有用なドキュメントや例を見つけるのに苦労しています。誰か私に正しい方向を教えてくれたり、直接助けてくれたりしませんか?
解決
一般に、これを実装する方法は、必要な関数をビューのコントローラーに追加し、そのデリゲートを設定するだけです。たとえば、ビューの読み込み時にコードを実行したい場合は、ビューをコントローラーに委任し、awakeFromNib 関数を実装するだけです。
したがって、テキスト ビューでキーの押下を検出するには、コントローラーがテキスト ビューのデリゲートであることを確認してから、これを実装します。
- (void)keyUp:(NSEvent *)theEvent
これは継承された NSResponder メソッドであり、NSTextView メソッドではないことに注意してください。
他のヒント
構文の強調表示に関するヒント:
テキストビュー全体を一度にハイライトしないでください。 とても 遅い。また、-editedRange を使用して最後に編集したテキストを強調表示しないでください。ユーザーが大量のテキスト本文をテキスト ビューに貼り付けると、非常に遅くなります。
代わりに、次のようにして、表示されているテキストを強調表示する必要があります。
NSRect visibleRect = [[[textView enclosingScrollView] contentView] documentVisibleRect];
NSRange visibleRange = [[textView layoutManager] glyphRangeForBoundingRect:visibleRect inTextContainer:[textView textContainer]];
次に、visibleRange を強調表示コードにフィードします。
あなたが本当に達成しようとしているもの、つまり NSTextView で主要なイベントをキャプチャすることで解決できると考えているより高いレベルの目標を伝えることが重要です。
たとえば、誰かが NSText で重要なイベントをキャプチャする方法を尋ねたとき、分野 彼らが本当に知りたいのは、フィールドへの入力を検証する方法です。これは、キーストロークを直接処理するのではなく、フィールドのフォーマッタを NSFormatter のインスタンス (Cocoa に含まれるフォーマッタの 1 つまたはカスタム フォーマッタ) に設定することによって行われます。
この例を踏まえると、実際に何を達成しようとしているのでしょうか?
私は一生懸命調べた結果、自分自身の質問に対する答えを見つけました。以下で詳しく説明しますが、回答してくれた 2 人に感謝します。Stack Overflow はすでに素晴らしいサイトだと思います。ベータ版が終了したら、より多くの Mac 開発者がアクセスできることを願っています。これは、このプラットフォームへの移行を検討している他の開発者にとって素晴らしいリソースになる可能性があります。
そこで、ダニーが提案したように、私は委任の中で答えを見つけました。Danny の投稿で私が理解できなかったのは、委任オブジェクトには一連のデリゲートが有効なメソッドがあり、デリゲートはそのイベントを実装する必要があるということでした。そこで、TextView については、textDidChange メソッドを見つけることができました。このメソッドは、単にキーの押下をキャプチャするよりもさらに優れた方法で、私が望んでいたものを実現しました。したがって、これをコントローラーに実装すると、次のようになります。
- (void)textDidChange:(NSNotification *)aNotification;
編集中のテキストに返信できます。もちろん、他の方法も利用できます。やっていくうちにたくさんのことを学べるとわかっているので、試してみるのが楽しみです。改めて感謝します。