iOS 11 dropInteraction执行文件的Drop

我怎样才能使用dropInteraction(_ interaction: UIDropInteraction, performDrop session: UIDropSession)接受除图像以外的其他types的文件? 说一下,我从文件应用程序拖动PDF或MP3。 我怎样才能接受这个文件并获取数据?

我以为我可以使用NSURL.self,但似乎只适用于从Safari浏览器拖动的URL和textview。

实现NSItemProviderReading PDF( com.adobe.pdf UTI)的NSItemProviderReading可能是这样的:

 class PDFDocument:NSObject, NSItemProviderReading { let data:Data? required init(pdfData:Data, typeIdentifier:String) { data = pdfData } static var readableTypeIdentifiersForItemProvider: [String] { return [kUTTypePDF as String] } static func object(withItemProviderData data: Data, typeIdentifier: String) throws -> Self { return self.init(pdfData: data, typeIdentifier: typeIdentifier) } } 

然后在你的委托中,你需要处理这个PDFDocument:

 extension YourClass: UIDropInteractionDelegate { func dropInteraction(_ interaction: UIDropInteraction, canHandle session: UIDropSession) -> Bool { return session.canLoadObjects(ofClass: PDFDocument.self)) } . . . func dropInteraction(_ interaction: UIDropInteraction, performDrop session: UIDropSession) { session.loadObjects(ofClass: PDFDocument.self) { [unowned self] pdfItems in if let pdfs = pdfItems as? [PDFDocument], let pdf = pdfs.first, let pdfData = pdf.data { // Whatever you want to do with pdfData } } } } 

dropInteraction你可以调用session.loadObjects(ofClass:) ,你可能已经有了,并且已经尝试了UIImageNSURL

ofClass需要符合NSItemProviderReading ( Documentation )。 符合它的默认类是NSStringNSAttributedStringNSURLUIColorUIImage 。 对于其他任何事情,我认为你需要制定一个符合协议的自定义类,使用public.mp3作为UTI 。 你的自定义类将有一个init(itemProviderData: Data, typeIdentifier: String)初始值设定项,它应该给你一个字节( itemProviderData ),它是MP3数据。 从那里,你应该能够根据需要写出你的文件。