如何从 NSDocument 的 read 方法中获取数据

How to get data from NSDocument's read method

我很难尝试将 'data' 放到 NSPasteboard 上。 'data',我指的是特定 PasteboardType 格式以外的类型:文本、HTML、图像等(实际上是 MIDI 数据。)

override func copy() -> Any {
  let pboard = NSPasteboard.general
    pboard.clearContents()
    pboard.setData(data, forType: .typeMidi)
        return true
    }

当我尝试输入数据时,我得到:

无法将“(String) throws -> Data”类型的值转换为预期的元素类型 'NSPasteboardWriting'。

这可能是因为我一直在尝试使用 NSDocument 的数据方法,但结果证明它只用于写入磁盘。

数据需要来自读取函数:

override func read(from data: Data, ofType typeName: String) throws {
    self.theMIDIPlayer = try AVMIDIPlayer.init(data: data, soundBankURL: nil)
    if self.theMIDIPlayer == nil {
         throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil)
}
}

但是read函数的参数好像不是NSDocument的data函数(只和写有关)。我不知道争论从何而来。

向读取函数添加类似 self.myData = data 的内容(试图获取有用的数据 属性)会产生 "Expected pattern" 错误。

已解决:问题是使用 copy() 而不是 copy(_:) 的小学生错误。

Vadian 现已删除的回答有助于创建自定义粘贴板类型。

完整(相关)代码如下:

extension NSPasteboard.PasteboardType {
    static let typeMidi = NSPasteboard.PasteboardType(rawValue: "public.midi-audio")
}

class Document: NSDocument {

    var theMIDIPlayer: AVMIDIPlayer?
    var myData: Data?

    @IBAction func copy(_: Any)  {
      let pboard = NSPasteboard.general
        pboard.clearContents()
        pboard.setData(myData, forType: .typeMidi)
    }

    override func read(from data: Data, ofType typeName: String) throws {
        self.theMIDIPlayer = try AVMIDIPlayer.init(data: data, soundBankURL: nil)
        self.myData = data
        if self.theMIDIPlayer == nil {
             throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil)
    }
    }