我有一个自定义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
中实现该功能时子类,它永远不会被调用。为什么不呢?
答案 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:
控制共享接收者布局管理器的文本视图是否表现为字段编辑器。
- (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
。