如何从 NSTableView 复制行

Pri*_*Raj 5 copy rows nstableview

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

ste*_*tef 2

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

\n

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

\n

第1部分

\n

添加copy(_:)paste(_:)方法NSTableView方法,可以在用户触发 Edit\xe2\x86\x92Copy 或 Edit\xe2\x86\x92Paste 菜单项时运行代码。响应者链将这些识别为选择器方法。

\n

第2部分

\n

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

\n

如何

\n

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

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

然后,这个扩展可以用作模板,基于一个NSTableView名为MyGreatTableView模板。

\n
class MyGreatTableView: NSTableView {\n    ...\n}\n\nextension MyGreatTableView: NSMenuItemValidation {\n    \n    override var acceptsFirstResponder: Bool { true }\n    \n    @IBAction func copy(_ sender: AnyObject?) {\n        // add your logic to copy the selected rows to the clipboard\n    }\n    \n    @IBAction func paste(_ sender: AnyObject?) {\n        // add your logic to paste rows from the clipboard\n    }\n    \n    func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {\n        switch menuItem.identifier {\n        case NSUserInterfaceItemIdentifier("menuEditCopy"):\n            // enable Copy if at least one row is selected\n\n            return numberOfSelectedRows > 0\n            \n        case NSUserInterfaceItemIdentifier("menuEditPaste"):\n            // enable Paste if clipboard contains data that is pasteable\n            \n            // ... \n            // (add your logic to read the clipboard\n            // and conditionally enable Paste here)\n            // ...\n            \n        default:\n            return false\n            \n        }\n    }\n    \n}\n
Run Code Online (Sandbox Code Playgroud)\n