4

我有一个自定义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:

编辑:字段编辑器似乎在选择文本字段进行编辑时将其设置为其委托。在这种情况下,按照此处所述附加到control:textView:doCommandBySelector:委托方法可能会有所帮助,但是当我在我的子类或我的子类中实现该函数时,它永远不会被调用。为什么不?NSTextFieldCellNSTableView

4

5 回答 5

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 子类中定义的自定义函数,它们跟踪当前编辑的单元格,然后相应地移动它。

于 2010-07-01T21:38:40.173 回答
1

Apple文档中可能相关的条目:

设置字段编辑器:

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

- (void)setFieldEditor:(BOOL)flag

参数

flagYES使共享接收者布局管理器的文本视图充当字段编辑器,NO否则。

讨论

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

于 2012-07-24T08:34:52.430 回答
0

完成您需要的最简单的方法是control:textView:doCommandBySelector:在表视图的委托中实现。

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

于 2015-06-17T06:55:40.733 回答
0

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

基本上,一个子类NSTextFieldCell和覆盖fieldEditorForView:,其中一个简单地创建一个自定义子类NSTextView并将其fieldEditor属性设置为YES.

于 2017-03-20T13:42:45.277 回答
-1

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

于 2010-07-01T17:04:06.183 回答