2012-07-05 66 views
0

的子类我有一个TextViewController这是NSViewController一个子类,其控制包含NSTextView管理FirstResponder在NSViewController

附上的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,但这看起来像一个kludge。

- (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 
+0

'[TextViewController keyDown]'执行什么操作? – trojanfoe 2012-07-05 13:41:00

回答

0

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

+0

我可能是一个使View Controller成为FirstResponder的错误,所以我添加了NSView的一个子类。我预计这也会从它封闭的NSTextView中得到kestrokes,但是这不起作用,所以我添加了NSTextView的一个子类 – Milliways 2012-07-07 05:06:51