5

我创建了一个基于视图 NSTableView的单列。此列填充了NSTableCellViewInterface Builder 的标准(我选择了带有图像和文本字段的版本)。

现在我想让列中的文本字段可编辑

我的第一次尝试是修改NSTextFieldfrom Interface builder 并将其行为设置为Editable. 它确实有效,当我选择一行并按下该字段时,enter key该字段变为可编辑并且我可以更改其值。NSTableViewDataSource我想我可以通过一些方法 来拦截这个变化,tableView:setObjectValue:forTableColumn:row:但是这个方法永远不会被调用来响应文本字段编辑操作。

在基于视图的 NSTableView 系统中处理可编辑字段的正确方法是什么?我想这NSTableViewDataSource与它有关,但我不知道如何调用它的方法。

4

2 回答 2

3

创建 NSTableCellView 的子类。(适当的 .h 和 .m 文件)使类响应 NSTextFieldDelegate 协议。实现 control:textShouldEndEditing: 方法。使这个子类成为标签控件的代表。

这是一些示例代码。

类别列表单元.h

@interface CategoryListCell : NSTableCellView
@end

类别列表单元.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
于 2012-12-17T19:36:48.547 回答
1

听起来您需要对单元格NSView中的内容进行子类化NSTableView,并使子类化视图成为文本字段的代表。然后,您的视图将通过NSTextField委托方法获得文本更改通知:

- (void)textDidChange:(NSNotification *)notification;
于 2012-12-06T15:07:57.220 回答