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

标签 macos cocoa nstableview

如何配置基于 View 的 NSTableView 使其行为如下:

  • 行可以选择
  • 用户无法通过单击单元格来触发编辑模式
  • 可以通过以编程方式调用 NSTableView-editColumn:row:withEvent:select: 来触发编辑模式

表格 View 是从 Xcode 界面构建器的对象库中拖出的,即它使用 NSTableCellView (带有 NSImageViewNSTextField > 作为其 subview )作为 TableView 的单元格 View 。

最佳答案

对于基于 View 的 TableView ,-editColumn:row:withEvent:select:是比较无效的。它尝试使单元格 View 成为窗口的第一响应者,但只有某些 View 才会接受第一响应者状态。 NSTableCellView不能,因为它本身不可编辑。

如果您想以编程方式在 NSTableCellView 内的文本字段中启动编辑,你可以这样做:

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

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

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

关于macos - 使 NSTableView 单元格只能以编程方式编辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29312625/

相关文章:

objective-c - NSTextField 和隐藏属性

macos - 右键单击 TableViewCell 时显示 popOver

objective-c - cocoa :如何在表格 View 单元格内嵌套按钮?

c++ - 使用 opencv 进行 qt5 部署,如何修复 lib 安装路径?

Swift - 获取当前在另一个应用程序中打开的文档的文件路径

macos - Mac 上的 Sublime Text 设置

objective-c - Cocoa 中的 copyItemAtURL

objective-c - 在拖放过程中在 NSTableView 中打开一个缺口

macos - 将 NSTableView 绑定(bind)到 Swift 中的字符串数组

macos - 我的 Mac 服务停用前台应用程序