拖放 - 从我的模型中创建一个NSItemProvider

时间:2018-01-23 21:17:57

标签: ios swift drag-and-drop uidragitem

让我们按部分进行!

我正在尝试在Drag and Drop中实施UICollectionViewController

UICollectionView的数据源是我创建的自定义array的{​​{1}}。

根据要求,我设置了Model Struct,这样我就实现了collectionView.dragDelegate = self required protocol function

这是我的问题开始的地方:

itemsForBeginning session: UIDragSession...

由于我的模型不符合struct Model { // some variables // Some initializations } var myModelDatasource: [Model] = [model1, model2, model3, ...] // it's a simple case example func collectionView(_ collectionView: UICollectionView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] { let item = myModelDatasource[indexPath.row] let itemProvider = NSItemProvider(object: item) let dragItem = UIDragItem(itemProvider: itemProvider) // <-- ERROR HERE, Even If i force cast as NSItemProviderWriting dragItem.localObject = item return [dragItem] } 类型,我无法创建dragItem

如果我强制数据源为NSItemProviderWriting类型并将该项目强制转换为String,那么它可以正常运行,但不适用于NSString

有谁知道如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

您应该为class使用Model(不是结构),因为正如您所建议的那样,您必须符合NSItemProviderWriting(继承自NSObjectProtocol) :

  

您在类上实现的协议,允许项提供程序从类的实例中检索数据。

许多API都期望NSObject的子类,因此你必须使用一个类, Apple blog: struct vs class

所以你的Model应该是这样的:

class Model : NSObject, NSItemProviderWriting {
    public static var writableTypeIdentifiersForItemProvider: [String] {
        return [] // something here
    }

    public func loadData(withTypeIdentifier typeIdentifier: String, forItemProviderCompletionHandler completionHandler: @escaping (Data?, Error?) -> Swift.Void) -> Progress? {
        return nil // something here
    }
}