参数类型’customClass.Type’不符合预期类型’NSItemProviderWriting’

iOS 11.x Swift 4

尝试使用新的drop and drag协议实现自定义类,并需要一些超级编码器帮助。 我创建了这个类。

import UIKit import MobileCoreServices class CustomClass: NSObject, NSItemProviderWriting, NSItemProviderReading { var image2D:Data? static var readableTypeIdentifiersForItemProvider = [kUTTypeData as String] static func object(withItemProviderData data: Data, typeIdentifier: String) throws -> Self { return try self.init(itemProviderData: data, typeidentifier: kUTTypeData as String) } required init(itemProviderData data: Data, typeidentifier: String) throws { super.init() image2D = data } static var writableTypeIdentifiersForItemProvider = [kUTTypeData as String] func loadData(withTypeIdentifier typeIdentifier: String, forItemProviderCompletionHandler completionHandler: @escaping (Data?, Error?) -> Void) -> Progress? { let data2E = image2D completionHandler(data2E, nil) return nil } } 

它编译,看起来不错? 然后我通过这个电话引用它。

 func dragInteraction(_ interaction: UIDragInteraction, itemsForBeginning session: UIDragSession) -> [UIDragItem] { let itemProvider = NSItemProvider(object: CustomClass) let dragItem = UIDragItem(itemProvider: itemProvider) return [dragItem] } 

我收到错误消息…参数类型’CustomClass.Type’不符合预期类型’NSItemProviderWriting’…

但除此之外,似乎无法在这里找到更多线索,无论在那里还是在任何地方都可以找到这方面的进展。

我实施了其中一个人的一个侧面点,它起作用了……

  itemProvider.registerDataRepresentation(forTypeIdentifier: kUTTypeJPEG as String, visibility: .all) 

我实现了其中一个人,它也有效…

 itemProvider.registerFileRepresentation(forTypeIdentifier: kUTTypeJPEG as String, fileOptions: [.openInPlace], visibility: .all) 

所以我在想,代码不能错了……当然……

错误消息是正确的,你的行:

 let itemProvider = NSItemProvider(object: customClass) 

由于所述原因不正确。 object参数期望某个类的实例符合NSItemProviderWriting协议。 但是你传递的是一个实际的类,而不是类的实例。

customClass替换为customClass的实际实例。 如果此方法在customClass ,则传递self

 let itemProvider = NSItemProvider(object: self) 

顺便说一句 – 如果遵循标准命名约定,这将不那么令人困惑。 类和结构名称应以大写字母开头。 变量和方法名称以小写字母开头。 所以你的customClass应该命名为CustomClass