使NSTableCellView可编辑

时间:2012-12-06 13:52:06

标签: macos cocoa nstableview

我使用一列创建了基于视图的 NSTableView。此列填充了Interface Builder中的标准NSTableCellView(我选择了包含图像和文本字段的版本)。

现在,我想在可编辑列中创建文本字段

我的第一次尝试是修改“接口”构建器中的NSTextField并将其行为设置为Editable。它确实有效,当我选择一行时,我推动enter key该字段变得可编辑,我可以更改其值。我认为我可以通过NSTableViewDataSource之类的tableView:setObjectValue:forTableColumn:row:方法来拦截此更改,但是在文本字段编辑操作的响应中永远不会调用此方法。

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

2 个答案:

答案 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;