我有一个基于单元格的NSOutlineView
显示NSTextFieldCell
对象。
我想响应 keydown 或 keyup 事件,以便在文本包含某些预设关键字时使 NSTextFieldCell 中包含的文本变为粗体。实现这一目标的最优雅方法是什么 - 我应该:
- 继承 NSOutlineView 并覆盖 keydown 方法
- 子类 NSTextFieldCell
- 利用某种委托
- 利用其他方法
非常感谢大家提供任何信息!
我有一个基于单元格的NSOutlineView
显示NSTextFieldCell
对象。
我想响应 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
}
为了以仍然可以过滤掉的方式截取按键,NSResponder
可以覆盖各种消息,例如keyDown:
或interpretKeyEvents:
。
为此,NSTextView
需要将 a 的子类用作字段编辑器。为此,一个 subclassesNSTextFieldCell
和 overrides fieldEditorForView:
,返回子类(请参阅NSTableView 中的 NSTextFieldCell 的自定义字段编辑器)。
以下是相关代码摘录:
在子类NSTextFieldCell
中(然后必须在 Interface Builder 中为可编辑列分配,或由NSTableViewDelegate
'sdataCellForTableColumn
消息返回):
- (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;
}