NSTableView通过清除文本删除行

时间:2013-05-02 16:46:42

标签: cocoa nstableview

我想要一个带有1个字符串列的简单表,它使用返回键添加一个新行。 如果用户也清除特定行上的文本,我也想删除一行。

我已设法使用此方法添加一个带返回键的新行:

-(BOOL)control:(NSControl*)control textView:(NSTextView*)textView doCommandBySelector:(SEL)commandSelector{
if (commandSelector == @selector(insertNewline:)) {
    [self returnKey];
    return YES;
}
else if(commandSelector == @selector(moveUp:)){
    [self tableMoveUp];
    return YES;
}
else if(commandSelector == @selector(moveDown:)){
    [self tableMoveDown];
    return YES;
}
else{
    NSLog(@"%@", NSStringFromSelector(commandSelector));
}

return NO;

}

当用户清除行上的文本并点击返回键时,问题是删除一行。在将表上的实际更改保存到数据源之前调用此方法。我已尝试在列上获取dataCell,如下所示:

NSTextFieldCell *cell = [self.tableView.tableColumns[0] dataCell];
NSLog(@"%@",cell.stringValue);

但是stringValue不准确。 关于如何实现这一点的任何想法? 谢谢!

1 个答案:

答案 0 :(得分:0)

由于表格列的数据单元格被重用于每一行(设置其值并在绘制,泡沫,冲洗,重复时将其“标记”到位),这是放置此类代码的奇怪之处。 “stringValue不准确”观察是一个很大的线索 - 它将被设置为细胞最后用于绘制的任何值,这不能也不应该被确定。

为什么不让数据源管理它?当-tableView:setObjectValue:forTableColumn:row:被调用,检查obj是否为空字符串/ nil / whatever,然后删除该行并重新加载。 “清空此单元格”是用户操作;表视图处理它并让其数据源(控制器)知道用户何时提交更改。

如果你想让“删除/退格删除行”然后自定义NSTextFieldCell以发送一个“MyTableRowWasDeleted”通知,你的数据源可以观察到该通知,并采取适当的步骤来结束编辑并删除“空”行,然后重装。