我有一个自定义的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:,moveLeft:和moveRight的功能:?
编辑:当选择进行编辑时,字段编辑器似乎将文本字段设置为其委托.在这种情况下,附加到控件可能会有所帮助:textView:doCommandBySelector:委托方法,如here所述,但是当我在我的NSTextFieldCell子类或我的NSTableView子类中实现该函数时,它永远不会被调用.为什么不?
解决方法
我几乎整天都在研究这个问题,但我终于明白了.为了能够使用箭头键遍历我的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子类中定义的自定义函数,它跟踪当前编辑的单元格,然后相应地移动它.