让我们按部分进行!
我正在尝试在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
。
有谁知道如何解决这个问题?
答案 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
}
}