如何从NSTableView复制行

时间:2010-09-17 06:47:44

标签: copy nstableview rows

我有一个NSTableView,它只显示一行数字。我只想使用(cmd + copy)或右键单击复制这些数字。如何在NSTableViews中实现此功能。

2 个答案:

答案 0 :(得分:1)

这就是我让它工作的方式,它的行为与响应者链的预期一致(仅在 NSTableView 本身成为第一响应者时调用,而不是在编辑表格单元格等时调用)。

这是一个由两部分组成的解决方案:

第 1 部分

copy(_:)paste(_:) 方法添加到 NSTableView 子类使代码能够在用户触发 Edit→Copy 或 Edit→Paste 菜单项时运行。响应者链将这些识别为选择器方法。

第 2 部分

使 NSTableView 子类符合 NSMenuItemValidation,以便我们可以验证是否应为用户启用这些复制或粘贴菜单项。 (在这种情况下这不是自动的,因此我们必须自己编写该逻辑)。

如何

首先,在您的主菜单(故事板)中,找到编辑菜单并打开属性检查器。然后:

  • 将复制标识符设置为“menuEditCopy”
  • 将粘贴标识符设置为“menuEditPaste”

然后,此扩展可用作模板,基于名为 NSTableViewMyGreatTableView 子类。

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,我记忆中的事情)