0

我有一个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
4

1 回答 1

0

子类NSTextView化听起来像是您描述的问题的最佳解决方案。您希望文本视图的行为与正常的选择、复制、Cmd-A 等一样,除了它还响应您定义的特殊按键。这是子类的标准用法。试图让视图控制器通过与第一响应者一起玩游戏来处理事情会给你带来各种边缘情况的问题,就像你发现的那样。

于 2012-07-05T19:33:48.023 回答