我使用一列创建了基于视图的 NSTableView
。此列填充了Interface Builder中的标准NSTableCellView
(我选择了包含图像和文本字段的版本)。
现在,我想在可编辑列中创建文本字段。
我的第一次尝试是修改“接口”构建器中的NSTextField
并将其行为设置为Editable
。它确实有效,当我选择一行时,我推动enter key
该字段变得可编辑,我可以更改其值。我认为我可以通过NSTableViewDataSource
之类的tableView:setObjectValue:forTableColumn:row:
方法来拦截此更改,但是在文本字段编辑操作的响应中永远不会调用此方法。
在基于视图的NSTableView系统中处理可编辑字段的正确方法是什么?我想NSTableViewDataSource
与它有关,但我不知道如何调用它的方法。
答案 0 :(得分:3)
创建NSTableCellView的子类。 (适当的.h和.m文件)使类响应NSTextFieldDelegate协议。实现控件:textShouldEndEditing:方法。使此子类成为标签控件的委托。
以下是一些示例代码。
CategoryListCell.h
@interface CategoryListCell : NSTableCellView
@end
CategoryListCell.m
@interface CategoryListCell()<NSTextFieldDelegate>
@property (weak) IBOutlet NSTextField *categoryLabel;
@property (assign) BOOL editing;
@property (copy) NSString* category;
@end
@implementation CategoryListCell
- (BOOL)control:(NSControl*)control textShouldBeginEditing:(NSText *)fieldEditor {
self.editing = YES;
return YES;
}
- (BOOL)control:(NSControl *)control textShouldEndEditing:(NSText *)fieldEditor; {
if (self.editing) {
self.editing = NO;
[self mergeFromSource:self.category toDestination:self.categoryLabel.stringValue];
}
return YES;
}
- (void)mergeFromSource:(NSString*)source toDestination:(NSString*) destination {
// your work here
}
@end
答案 1 :(得分:1)
听起来你需要继承NSView
单元格中的NSTableView
,并使子类视图成为文本字段的委托。然后,您的视图将通过NSTextField
委托方法获取文本更改通知:
- (void)textDidChange:(NSNotification *)notification;