使 NSTableView 单元格只能以编程方式编辑

Make NSTableView cells editable programmatically only

如何将基于视图的 NSTableView 配置为如下所示:

table 视图是从 Xcode 界面生成器的对象库中拖出的,即它使用 NSTableCellView(带有 NSImageViewNSTextField 作为其子视图)作为 table 视图的单元格视图。

对于基于视图的 table 视图,-editColumn:row:withEvent:select: 相对无效。它试图使单元格视图成为 window 的第一响应者,但只有某些视图会接受第一响应者状态。 NSTableCellView 不会,因为它本身不是 editable.

如果您想以编程方式在 NSTableCellView 内的文本字段中启动编辑,您可以执行以下操作:

NSTableCellView* cellView = (NSTableCellView*)[tableView viewAtColumn:col row:row makeIfNecessary:YES];
if ([cellView.textField acceptsFirstResponder])
    [cellView.window makeFirstResponder:cellView.textField];

要禁止用户通过 UI 开始编辑,我认为您需要将文本字段设置为不可编辑 table。在以编程方式开始编辑之前,您可以将其设置为 editable 。比如在上面两行中间加一行cellView.textField.editable = YES;

然后,您需要在编辑结束后将其设置回非 editable。为此,您可以将文本字段的 delegate 设置为您的控制器对象并实现 -controlTextDidEndEditing:。或者,类似地,您可以从文本字段添加 NSControlTextDidEndEditingNotification 通知的观察者。无论哪种方式,当您的代码被调用时,您将文本字段的 editable 属性 设置回 false。 (如果您没有对相关文本字段的引用,您可以从 NSNotificationobject 属性 中获取它。)