2008-08-14 20 views
15

私はObjective-CとCocoaをゆっくりと学習しています。テキストビューでキーイベントをキャプチャする方法は、委任を使用することだけですが、役に立つドキュメンテーションや例を見つけるのは難しいです。溶液。誰かが正しい方向に私を指すことができる、またはいくつかの直接手助けを供給することができますか?NSTextViewでキーイベントをキャプチャする最も良い方法は?

答えて

14

一般に、実装する方法は、必要な機能をビューのコントローラに追加し、デリゲートを設定するだけです。たとえば、ビューの読み込み時にコードを実行するには、ビューをコントローラに委譲してawakeFromNib関数を実装します。これは継承NSResponderメソッドではなく、NSTextViewであること

- (void)keyUp:(NSEvent *)theEvent 

注:

だから、これを実装する、あなたのコントローラは、テキストビューのデリゲートであることを確認し、テキストビューでキーを押しを検出すること、および方法。

+1

keyUpは、デリゲートに入れると呼び出されません。 NSTextViewをサブクラス化してそこに置く必要があります。 –

2

あなたが実際に達成しようとしていること、つまり、NSTextViewの重要なイベントをキャプチャすると考える上位目標は、私たちに伝えることが重要です。

たとえば、NSText フィールドで重要なイベントをキャプチャする方法を聞いたときに、実際にフィールドの入力を検証する方法があります。これは、フィールドのフォーマッタを、NSFormatterのインスタンス(Cocoaに含まれているフォーマッタでも、カスタムのものでも)に設定し、キーストロークを直接処理することではありません。

この例では、実際に何を達成しようとしていますか?

1

私はいくつかの掘り下げを行いました。自分の質問に対する答えを見つけました。私は下にそれを得るでしょうが、答えた2人の友達に感謝します。 Stack Overflowはすでに素晴らしいサイトだと思います。ベータ版が終わったばかりのMac開発者が増えることを願っています。これは、プラットフォームに移行しようとしている他の開発者にとって大きなリソースになる可能性があります。

私は、Dannyの提案によれば、私の回答を代表団で見つけました。私がDannyのポストから理解できなかったことは、デリゲートするオブジェクトにデリゲート対応のメソッドのセットがあり、デリゲートがそのイベントを実装する必要があるということでした。 TextViewではtextDidChangeメソッドを見つけることができました。これは、キープレスを単純にキャプチャするよりも、私が望むことを達成しました。したがって、コントローラでこれを実装した場合:

- (void)textDidChange:(NSNotification *)aNotification; 

私は編集中のテキストに応答できます。もちろん、他の方法もありますし、私は彼らと一緒に遊ぶことに興奮しています。なぜなら、わたしは私のようにたくさんのことを学びます。もう一度ありがとう、みんな。シンタックスハイライトのためだけ先端

10

は一度に全体のテキストビューをハイライトしないでください - それは非常に遅いです。また、最後に編集したテキストを-editedRangeで強調表示しないでください。ユーザーがテキストビューに大きなテキストを貼り付けると、非常に遅くなります。

代わりに、あなたは次のように行われている目に見えるテキストの強調表示する必要があります。そして、あなたはあなたのハイライトコードにvisibleRangeを養う

NSRect visibleRect = [[[textView enclosingScrollView] contentView] documentVisibleRect]; 
NSRange visibleRange = [[textView layoutManager] glyphRangeForBoundingRect:visibleRect inTextContainer:[textView textContainer]]; 

を。

関連する問題