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:)
,你可能已经有了,并且已经尝试了UIImage
和NSURL
。
ofClass
需要符合NSItemProviderReading
( Documentation )。 符合它的默认类是NSString
, NSAttributedString
, NSURL
, UIColor
和UIImage
。 对于其他任何事情,我认为你需要制定一个符合协议的自定义类,使用public.mp3
作为UTI 。 你的自定义类将有一个init(itemProviderData: Data, typeIdentifier: String)
初始值设定项,它应该给你一个字节( itemProviderData
),它是MP3数据。 从那里,你应该能够根据需要写出你的文件。