2013-07-15 42 views
1

我有一个基于单元格的NSOutlineView,它显示NSTextFieldCell对象。拦截NSTextFieldCell中的Keydown操作

我想回应keydown或keyup事件,以便在文本包含某些预设关键字时使NSTextFieldCell中包含的文本变为粗体。什么是最优雅的方式来做到这一点 - 我应该:

  • 子类NSOutlineView并重写的keydown方法
  • 子类NSTextFieldCell
  • 利用某种
  • 的代表利用一些其他的方法

非常感谢所有的信息!

+0

嗯,也许我应该改写的问题,以限制它的原作者的特殊请求,而不是用赏金扩大它的。现在太晚了。 –

回答

0

找到它。

在awakeFromNib:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(actionToTakeOnKeyPress:) name:NSControlTextDidChangeNotification object:theNSOutlineViewThatContainsTheNSTextFieldCell]; 

然后加入这样的方法:

- (void) actionToTakeOnKeyPress: (id) sender 
{ 
    //will be called whenever contents of NSTextFieldCell change 
} 
+0

我有同样的问题,但您的答案不适合,因为该通知被调用后键入的键已被文本字段处理。我需要拦截按键之前,并有选择地丢弃它,以便它不会在文本字段中结束。为此,根据文档,keyDown必须被覆盖,但这是我无法解决的NSTextFieldCell,但。 –

0

拦截按键的方式,它们仍然可以被过滤掉,各种NSResponder消息可以被覆盖,如keyDown:interpretKeyEvents:

为了做到这一点,需要使用NSTextView的子类作为字段编辑器。为此,一个子类NSTextFieldCell并重写fieldEditorForView:,返回子类(请参阅Custom field editor for NSTextFieldCell in an NSTableView)。

这里的相关代码摘录:

在子类的NSTextFieldCell(其然后在界面生成器将被分配为可编辑的柱,或者通过返回NSTableViewDelegatedataCellForTableColumn消息):

- (NSTextView *)fieldEditorForView:(NSView *)aControlView 
{ 
    if (!self.myFieldEditor) { 
     self.myFieldEditor = [[MyTextView alloc] init]; 
     self.myFieldEditor.fieldEditor = YES; 
    } 
    return self.myFieldEditor;  
} 

它还需要在@interface部分声明一个属性:

@property (strong) MyTextView *myFieldEditor; 

然后在MyTextView,这是NSTextView子类:

-(void)keyDown:(NSEvent *)theEvent 
{ 
    NSLog(@"MyTextView keyDown: %@", theEvent.characters); 
    static bool b = true; 
    if (b) { // this silly example only lets every other keypress through. 
     [super keyDown:theEvent]; 
    } 
    b = !b; 
} 
+0

再次,抱歉打开一个赏金,但然后发布我自己的解决方案。这一切花了我4个多小时才弄清楚,在它的中间,我想我找不到解决办法,所以我太早开始赏金。我现在不能收回。 –