NSTextFieldCell的自定义字段编辑器,位于NSTableView中

时间:2010-07-01 16:55:59

标签: objective-c cocoa delegates nstableview fieldeditor

我有一个自定义NSTableView子类,里面填充了几个自定义NSTextFieldCell子类。我希望能够使用箭头键更改已编辑的单元格。

我可以通过创建自定义字段编辑器(通过子类化NSTextView)并从窗口委托中返回它来完成此操作:

- (id) windowWillReturnFieldEditor:(NSWindow *) aWindow toObject:(id) anObject {
    if ([anObject isEqual:myCustomTable]) {
        if (!myCustomFieldEditor) {
            myCustomFieldEditor = [[MyNSTextViewSubclass alloc] init];
            [myCustomFieldEditor setTable:anObject];
        }
        return myCustomFieldEditor;
    }
    else {
        return nil;
    }
}

MyNSTextViewSubclass中,我覆盖moveUp:moveDown:moveLeft:moveRight:方法以实现我们所需的功能,并且一切正常。唯一的问题是字段编辑器不再像文本字段单元格编辑器那样。例如,当我按Enter键时,它会在文本字段中插入换行符,而不是结束编辑。

如何创建自定义字段编辑器,其响应方式与NSTextFieldCell的默认字段编辑器完全相同(我将覆盖的那四个函数除外)?或者是否有更好的效果?更改moveUp:moveDown:moveLeft:moveRight:的功能的方式?

编辑:当选择进行编辑时,字段编辑器会将文本字段设置为其委托。在这种情况下,如here所述,仅附加到control:textView:doCommandBySelector:委托方法可能会有所帮助,但是当我在NSTextFieldCell子类或NSTableView中实现该功能时子类,它永远不会被调用。为什么不呢?

5 个答案:

答案 0 :(得分:4)

我几乎整天都在研究这个问题,但我终于明白了。为了能够使用箭头键遍历我的NSTableView子类,我不得不将以下方法添加到我的NSTableView中:

- (BOOL)textView:(NSTextView *)aTextView doCommandBySelector:(SEL)aSelector {
    if(aSelector == @selector(moveUp:)) {
        [self moveSelectionToPreviousRow];
        return YES;
    } else if(aSelector == @selector(moveDown:)) {
        [self moveSelectionToNextRow];
        return YES;
    } else if(aSelector == @selector(moveLeft:)) {
        [self moveSelectionToPreviousColumn];
        return YES;
    } else if(aSelector == @selector(moveRight:)) {
        [self moveSelectionToNextColumn];
        return YES;
    }
    return NO;
}

这是因为默认的字段编辑器是NSTextView(不是NSControl)所以我需要使用<NSTextViewDelegate>协议。设置为其委托的视图是NSTableView, NSTextFieldCell。 moveSelectionTo...函数是我的NSTableView子类中定义的自定义函数,用于跟踪当前编辑的单元格,然后相应地移动它。

答案 1 :(得分:1)

Possibly related entry in Apple documentation:

setFieldEditor:

控制共享接收者布局管理器的文本视图是否表现为字段编辑器。

- (void)setFieldEditor:(BOOL)flag

参数

标记YES使共享接收者布局管理器的文本视图表现为字段编辑器,否则为NO

讨论

字段编辑器将Tab,Shift-Tab和Return(Enter)解释为结束编辑的提示,并可能更改第一个响应者。非字段编辑器接受这些字符作为文本输入。有关字段编辑器的更多信息,请参见“文本字段,文本视图和字段编辑器”。默认情况下,文本视图不像字段编辑器那样。

答案 2 :(得分:0)

完成所需内容的最简单方法是在表格视图的委托中实施control:textView:doCommandBySelector:

另请参阅我在此处对类似问题的回答:Arrow keys with NSTableView

答案 3 :(得分:0)

这个问题的更一般标题的答案可以在这个答案中找到:https://stackoverflow.com/a/8865953/43615

基本上,一个子类NSTextFieldCell并覆盖fieldEditorForView:,其中一个只创建NSTextView的自定义子类,并将其fieldEditor属性设置为YES。< / p>

答案 4 :(得分:-1)

应在子类keyDown:(NSEvent *)event对象的NSTextFieldCell方法中覆盖这些内容。您检查按下的键(其中一个箭头),否则调用super