我有一个NSTableView,它只显示一行数字。我只想使用(cmd + copy)或右键单击复制这些数字。如何在NSTableViews中实现此功能。
答案 0 :(得分:1)
这就是我让它工作的方式,它的行为与响应者链的预期一致(仅在 NSTableView 本身成为第一响应者时调用,而不是在编辑表格单元格等时调用)。
这是一个由两部分组成的解决方案:
将 copy(_:)
和 paste(_:)
方法添加到 NSTableView
子类使代码能够在用户触发 Edit→Copy 或 Edit→Paste 菜单项时运行。响应者链将这些识别为选择器方法。
使 NSTableView
子类符合 NSMenuItemValidation
,以便我们可以验证是否应为用户启用这些复制或粘贴菜单项。 (在这种情况下这不是自动的,因此我们必须自己编写该逻辑)。
首先,在您的主菜单(故事板)中,找到编辑菜单并打开属性检查器。然后:
然后,此扩展可用作模板,基于名为 NSTableView
的 MyGreatTableView
子类。
class MyGreatTableView: NSTableView {
...
}
extension MyGreatTableView: NSMenuItemValidation {
override var acceptsFirstResponder: Bool { true }
@IBAction func copy(_ sender: AnyObject?) {
// add your logic to copy the selected rows to the clipboard
}
@IBAction func paste(_ sender: AnyObject?) {
// add your logic to paste rows from the clipboard
}
func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
switch menuItem.identifier {
case NSUserInterfaceItemIdentifier("menuEditCopy"):
// enable Copy if at least one row is selected
return numberOfSelectedRows > 0
case NSUserInterfaceItemIdentifier("menuEditPaste"):
// enable Paste if clipboard contains data that is pasteable
// ...
// (add your logic to read the clipboard
// and conditionally enable Paste here)
// ...
default:
return false
}
}
}
答案 1 :(得分:0)
默认情况下,编辑菜单(剪切/复制/粘贴/等)是自动启用的,前提是tableView行中的文本是可选择的或可编辑的,并且相关的文本字段位于响应者链中。
自动启用的菜单项通过查看响应者链来工作。如果第一响应者响应菜单项被绑定的选择器,则启用菜单项。如果第一响应者没有响应给定菜单项的选择器,则菜单项被禁用
您希望确保表格单元格/视图中的文本字段元素是可选的(您可以在界面构建器中打开/关闭它),还要确保您的文本字段acceptFirstResponder(可能被称为allowsFirstResponder,我记忆中的事情)