私はゆっくりと Objective-C と Cocoa を学んでいます。これまでのところ、テキスト ビューで重要なイベントをキャプチャする唯一の方法は委任を使用することですが、そのようなソリューションを実装する方法に関する有用なドキュメントと例を見つけるのに苦労しています。誰かが私を正しい方向に向けたり、直接助けを提供したりできますか?
4 に答える
通常、これを実装する方法は、必要な関数をビューのコントローラーに追加し、そのデリゲートを設定するだけです。たとえば、ビューの読み込み時にコードを実行する場合は、ビューをコントローラーに委譲し、awakeFromNib 関数を実装するだけです。
したがって、テキスト ビューでキーの押下を検出するには、コントローラーがテキスト ビューのデリゲートであることを確認してから、次のように実装します。
- (void)keyUp:(NSEvent *)theEvent
これは、NSTextView メソッドではなく、継承された NSResponder メソッドであることに注意してください。
構文を強調するためのヒント:
テキストビュー全体を一度に強調表示しないでください。非常に低速です。また、-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 開発者が道を見つけてくれることを願っています。これは、プラットフォームへの移行を検討している他の開発者にとって優れたリソースになる可能性があります。
それで、ダニーが提案したように、私は委任で私の答えを見つけました。ダニーの投稿から私が理解できなかったのは、デリゲート オブジェクトに一連のデリゲート対応メソッドがあり、デリゲートがそのイベントを実装する必要があるということでした。そのため、TextView の場合、メソッド textDidChange を見つけることができました。このメソッドは、単にキーの押下をキャプチャするよりも優れた方法で目的を達成しました。したがって、これをコントローラーに実装すると、次のようになります。
- (void)textDidChange:(NSNotification *)aNotification;
編集中のテキストに応答できます。もちろん、他の方法も利用できます。私はそれらを試してみたいと思っています。ありがとう、みんな。