1

我有一个基于单元格的NSOutlineView显示NSTextFieldCell对象。

我想响应 keydown 或 keyup 事件,以便在文本包含某些预设关键字时使 NSTextFieldCell 中包含的文本变为粗体。实现这一目标的最优雅方法是什么 - 我应该:

  • 继承 NSOutlineView 并覆盖 keydown 方法
  • 子类 NSTextFieldCell
  • 利用某种委托
  • 利用其他方法

非常感谢大家提供任何信息!

4

2 回答 2

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
}
于 2013-07-16T01:24:51.060 回答
0

为了以仍然可以过滤掉的方式截取按键,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;
}
于 2017-03-20T14:12:09.240 回答