简体   繁体   中英

How to get data from NSDocument's read method

I'm having difficulty trying to put 'data' onto NSPasteboard. By 'data', I mean a type other than the specific PasteboardType formats: text, HTML, image, etc. (It's actually MIDI data.)

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

When I try to put my data in, I get:

Cannot convert value of type '(String) throws -> Data' to expected element type 'NSPasteboardWriting'.

That's probably because I've been trying to use NSDocument's data method, but it turns out that's only for writing out to disk.

The data needs to come from the read function:

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)
}
}

But it seems that the read function's arguments are not NSDocument's data function (which only relates to writing). I've no idea where the arguments come from.

Adding something like self.myData = data to the read function (in an attempt to get the data in a useful property) produce "Expected pattern" errors.

SOLVED: The problem was a schoolboy error of using copy() instead of copy(_:) .

Vadian's now deleted answer was helpful in creating a custom Pasteboard type.

The complete (relevant) code is as follows:

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)
    }
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM