首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >拦截NSTextFieldCell中的按键操作

拦截NSTextFieldCell中的按键操作
EN

Stack Overflow用户
提问于 2013-07-15 21:01:27
回答 2查看 415关注 0票数 1

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

我希望对按键或按键事件做出响应,以便当文本包含某些预置关键字时,将NSTextFieldCell中包含的文本粗体化。实现这个目标的最优雅的方法是什么?我应该:

  • 子类NSOutlineView并重写keydown方法。
  • 子类NSTextFieldCell
  • 利用某种委托
  • 利用其他方法

非常感谢所有的人的任何信息!

EN

回答 2

Stack Overflow用户

发布于 2013-07-16 01:24:51

找到了。

在awakeFromNib中:

代码语言:javascript
复制
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(actionToTakeOnKeyPress:)  name:NSControlTextDidChangeNotification object:theNSOutlineViewThatContainsTheNSTextFieldCell]; 

然后添加如下方法:

代码语言:javascript
复制
- (void) actionToTakeOnKeyPress: (id) sender
{
    //will be called whenever contents of NSTextFieldCell change
}
票数 0
EN

Stack Overflow用户

发布于 2017-03-20 14:12:09

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

要做到这一点,需要使用NSTextView的子类作为字段编辑器。为此,一个子类NSTextFieldCell和重写fieldEditorForView:,返回子类(参见NSTextFieldCell在NSTableView中的自定义字段编辑器)。

以下是相关的代码摘录:

在子类NSTextFieldCell中(必须在接口生成器中为可编辑列分配该子类,或由NSTableViewDelegatedataCellForTableColumn消息返回):

代码语言:javascript
复制
- (NSTextView *)fieldEditorForView:(NSView *)aControlView
{
    if (!self.myFieldEditor) {
        self.myFieldEditor = [[MyTextView alloc] init];
        self.myFieldEditor.fieldEditor = YES;
    }
    return self.myFieldEditor;    
}

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

代码语言:javascript
复制
@property (strong) MyTextView *myFieldEditor;

然后在MyTextView中,它是NSTextView的一个子类

代码语言:javascript
复制
-(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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17663866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档