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

时间:2019-09-16 11:04:00

标签: swift macos nsdocument

我在尝试将“数据”放入NSPasteboard时遇到困难。 “数据”是指除特定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的内容(试图获取有用属性中的数据)会产生“预期模式”错误。

1 个答案:

答案 0 :(得分:0)

已解决:问题是使用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)
    }
    }