を含むビューを制御するTextViewController
サブクラスである がありますNSViewController
NSTextView
TextViewController
次のコードを使用して、既存のビューにのインスタンスをアタッチします
TextViewController *textViewer;
...
[[self view] addSubview:[textViewer view]]; // embed new TextView in our host view
[[textViewer view] setFrame:[[self view] bounds]]; // resize the controller's view to the host size
textViewer.delegate = self;
[split.window makeFirstResponder:textViewer];
これは非常にうまく機能し、イベントをTextViewController
トラップしてさまざまなアクションを実行します。keyDown
NSTextView
ユーザーがテキストを選択してクリップボードにコピーできるようにしたかったのです。残念ながら、 をクリックすると にNSTextView
なり、FirstResponder
キーTextViewController
を押しても反応しなくなります。
FirstResponder を強制的に TextViewController に戻すことはできますが、これは面倒なようです。
- (void)textViewDidChangeSelection:(NSNotification *)aNotification {
[self.view.window makeFirstResponder:self];
}
keyDown イベントをトラップするためにサブクラス化できることはわかってNSTextView
いますが、これはあまり良くないようです。
これを行うためのよりエレガントな方法があるに違いないと確信しています。
keyDown をコントローラーに渡すだけの NSTextView のサブクラスを追加しました
@protocol MyTextViewDelegate
- (BOOL)keyPressedInTextView:(NSEvent *)theEvent;
@end
@interface MyTextView : NSTextView
@property (assign) IBOutlet NSObject <MyTextViewDelegate> *delegate;
@end
...
@implementation MyTextView
@synthesize delegate;
- (void)keyDown:(NSEvent *)theEvent {
if([self.delegate respondsToSelector:@selector(keyPressedInTextView:)]) {
if([self.delegate keyPressedInTextView:theEvent])
return;
}
[super keyDown:theEvent];
}
@end