我有一个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];
}
我知道我可以子类NSTextView
化来捕获 keyDown 事件,但这似乎并没有好多少。
我确信必须有一种更优雅的方式来做到这一点。
我添加了一个 NSTextView 的子类,它只是将 keyDown 传递给控制器
@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