我正在尝试使用拖放方法将.mp3文件从finder中拖到我的应用程序中(使用mac催化剂)。到目前为止,我已经成功地将mp3文件中的原始数据获取到一个数组中,但是我不确定如何继续。我最终想要的是使用AVAudioPlayerNodes播放放到应用程序中的.mp3文件。这是正确的方法,还是我应该尝试获取文件的URL,然后将其复制到我的应用中?任何帮助都是极好的。谢谢。
代码: 委托方法
func dropInteraction(_ interaction: UIDropInteraction, sessionDidUpdate session: UIDropSession) -> UIDropProposal {
if session.localDragSession == nil {
print("yes")
return UIDropProposal(operation: .copy)
}
print("no")
return UIDropProposal(operation: .cancel)
}
func dropInteraction(_ interaction: UIDropInteraction, performDrop session: UIDropSession) {
print("somethng happened")
session.loadObjects(ofClass: MP3Class.self) { objects in
for url in objects as! [MP3Class] {
print(url)
print(objects)
}
}
}
func dropInteraction(_ interaction: UIDropInteraction, canHandle session: UIDropSession) -> Bool {
return session.canLoadObjects(ofClass: MP3Class.self)
}
func customEnableDropping(on view: UIView, dropInteractionDelegate: UIDropInteractionDelegate) {
let dropInteraction = UIDropInteraction(delegate: dropInteractionDelegate)
view.addInteraction(dropInteraction)
}
自定义mp3类别:
class MP3Class: NSObject, NSItemProviderReading {
let data: Data?
required init(mp3Data: Data, typeIdentifier: String) {
data = mp3Data
}
static var readableTypeIdentifiersForItemProvider: [String] {
return [kUTTypeMP3 as String]
}
static func object(withItemProviderData data: Data, typeIdentifier: String) throws -> Self {
return self.init(mp3Data: data, typeIdentifier: typeIdentifier)
}
}
答案 0 :(得分:0)
好的,我设法使其正常运行。 因此,这非常简单,只需要在performDrop方法中的documents文件夹中创建一个目录,然后您就可以将数据简单地写入文件路径,因此对我来说是这样的:
do {
try url.data!.write(to: filePath, options: .atomic)
print("succes")
} catch {
print("Failed while storing files.")
}
其中的filePath指向.mp3文件。 而已。我以为也许我不能以这种方式播放mp3,但它的运作就像是一种魅力。唯一不起作用的是获取与原始数据相同的文件名。但我敢肯定还有一个窍门:)