我在尝试将“数据”放入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
的内容(试图获取有用属性中的数据)会产生“预期模式”错误。
答案 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)
}
}