我有一个基于单元格的NSOutlineView
,它显示NSTextFieldCell
对象。拦截NSTextFieldCell中的Keydown操作
我想回应keydown或keyup事件,以便在文本包含某些预设关键字时使NSTextFieldCell中包含的文本变为粗体。什么是最优雅的方式来做到这一点 - 我应该:
- 子类NSOutlineView并重写的keydown方法
- 子类NSTextFieldCell
- 利用某种
- 的代表利用一些其他的方法
非常感谢所有的信息!
我有一个基于单元格的NSOutlineView
,它显示NSTextFieldCell
对象。拦截NSTextFieldCell中的Keydown操作
我想回应keydown或keyup事件,以便在文本包含某些预设关键字时使NSTextFieldCell中包含的文本变为粗体。什么是最优雅的方式来做到这一点 - 我应该:
非常感谢所有的信息!
找到它。
在awakeFromNib:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(actionToTakeOnKeyPress:) name:NSControlTextDidChangeNotification object:theNSOutlineViewThatContainsTheNSTextFieldCell];
然后加入这样的方法:
- (void) actionToTakeOnKeyPress: (id) sender
{
//will be called whenever contents of NSTextFieldCell change
}
我有同样的问题,但您的答案不适合,因为该通知被调用后键入的键已被文本字段处理。我需要拦截按键之前,并有选择地丢弃它,以便它不会在文本字段中结束。为此,根据文档,keyDown必须被覆盖,但这是我无法解决的NSTextFieldCell,但。 –
拦截按键的方式,它们仍然可以被过滤掉,各种NSResponder
消息可以被覆盖,如keyDown:
或interpretKeyEvents:
。
为了做到这一点,需要使用NSTextView
的子类作为字段编辑器。为此,一个子类NSTextFieldCell
并重写fieldEditorForView:
,返回子类(请参阅Custom field editor for NSTextFieldCell in an NSTableView)。
这里的相关代码摘录:
在子类的NSTextFieldCell
(其然后在界面生成器将被分配为可编辑的柱,或者通过返回NSTableViewDelegate
的dataCellForTableColumn
消息):
- (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;
}
再次,抱歉打开一个赏金,但然后发布我自己的解决方案。这一切花了我4个多小时才弄清楚,在它的中间,我想我找不到解决办法,所以我太早开始赏金。我现在不能收回。 –
嗯,也许我应该改写的问题,以限制它的原作者的特殊请求,而不是用赏金扩大它的。现在太晚了。 –