HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – 拖放 – 从我的模型中创建一个NSItemProvider大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
让我们按部分去!

我正在尝试在我的UICollectionViewController中实现拖放.

UICollectionView的数据源是我创建的自定义模型结构的数组.

根据需要,我设置了我的collectionView.dragDelegate = self,通过这样做我已经实现了所需的协议函数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]
}@H_489_16@ 
 

我无法创建dragItem,因为我的模型不符合NSItemProviderWriTing类型.

如果我强制数据源是String类型并将项目强制转换为NSString它可以工作,但不能用我的struct Model.

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

解决方法

您应该为模型使用类(而不是结构),因为正如您所建议的那样,您必须符合NSItemProviderWriTing(继承自NSObjectProtocol):

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

所以你的模型应该是这样的

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
    }
}@H_489_16@

大佬总结

以上是大佬教程为你收集整理的ios – 拖放 – 从我的模型中创建一个NSItemProvider全部内容,希望文章能够帮你解决ios – 拖放 – 从我的模型中创建一个NSItemProvider所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。