iOS 11文件的dropInteraction performDrop

iOS 11文件的dropInteraction performDrop,ios,drag-and-drop,ios11,Ios,Drag And Drop,Ios11,如何使用dropInteraction(uinteraction:UIDropInteraction,performDrop session:UIDropSession)接受图像以外的其他类型的文件?例如,我从文件应用程序中拖动PDF或MP3。如何接受此文件并获取数据 我想我可以使用NSURL.self,但这似乎只适用于从Safari och文本视图中拖拽的URL 在dropInteraction中,您可以调用session.loadObjects(类:),您可能已经拥有并尝试了UIImage和

如何使用
dropInteraction(uinteraction:UIDropInteraction,performDrop session:UIDropSession)
接受图像以外的其他类型的文件?例如,我从文件应用程序中拖动PDF或MP3。如何接受此文件并获取数据


我想我可以使用NSURL.self,但这似乎只适用于从Safari och文本视图中拖拽的URL

dropInteraction
中,您可以调用
session.loadObjects(类:)
,您可能已经拥有并尝试了
UIImage
NSURL

类的
需要符合
NSItemProviderReading
()。符合它的默认类是
NSString
NSAttributedString
NSURL
UIColor
UIImage
。对于其他内容,我认为您需要创建一个符合协议的自定义类,使用
public.mp3
作为。您的自定义类将有一个
init(itemProviderData:Data,typeIdentifier:String)
初始值设定项,该初始值设定项将为您提供一包作为MP3数据的字节(
itemProviderData
)。从那里,您应该能够根据需要写出您的文件。

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)
    }
}
然后在您的代理人中,您需要处理此PDF文档:

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 {
                // Whatever you want to do with the pdf
            }
        }
    }
}

谢谢,尝试过这个,但不断崩溃…你成功让它工作了吗?嗯,你尝试过从文件应用拖动吗?我一直在获取libc++abi.dylib:以NSException类型的未捕获异常终止。附言–如果我从一个在线PDF示例中拖动它,它会工作。只是不是从文件应用程序?您在
dropInteraction(\uinteraction:UIDropInteraction,sessiondiddupdate session:UIDropSession)
中有什么?您如何获得所选的文件名和位置?