使 NSTableView 单元格只能以编程方式编辑
Make NSTableView cells editable programmatically only
如何将基于视图的 NSTableView
配置为如下所示:
- 行已选择table
- 用户无法通过单击单元格来触发编辑模式
- 可以通过以编程方式调用
NSTableView-editColumn:row:withEvent:select:
来触发编辑模式
table 视图是从 Xcode 界面生成器的对象库中拖出的,即它使用 NSTableCellView
(带有 NSImageView
和 NSTextField
作为其子视图)作为 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。 (如果您没有对相关文本字段的引用,您可以从 NSNotification
的 object
属性 中获取它。)
如何将基于视图的 NSTableView
配置为如下所示:
- 行已选择table
- 用户无法通过单击单元格来触发编辑模式
- 可以通过以编程方式调用
NSTableView-editColumn:row:withEvent:select:
来触发编辑模式
table 视图是从 Xcode 界面生成器的对象库中拖出的,即它使用 NSTableCellView
(带有 NSImageView
和 NSTextField
作为其子视图)作为 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。 (如果您没有对相关文本字段的引用,您可以从 NSNotification
的 object
属性 中获取它。)