首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于拖放集合视图功能的不使用itemProvider的自定义数据- Swift

用于拖放集合视图功能的不使用itemProvider的自定义数据- Swift
EN

Stack Overflow用户
提问于 2021-07-24 21:49:36
回答 1查看 112关注 0票数 0

我有一个集合视图,它显示一个名为“claimData”的自定义数据模型(struct)中排列的数据。

claimData声明:

代码语言:javascript
复制
struct claimData {
    var image = UIImage()
    var imageTitle = String()
    var hasCustomDescription = Bool()
    var customDescription = String()
    var isAnInitial = Bool()
    var isDamage = Bool()
    var isUnrelated = Bool()
    var isAnOption = Bool()
    var isACondition = Bool()
}

我通过sharedInstance共享这些数据的状态,因为我使用的是浮动面板。

代码语言:javascript
复制
class PageDataSource {
    var theData: ReviewDataController?
    static let sharedInstance = PageDataSource()
    private init() {}
}

ReviewDataController只是持有一个名为"tableViewReviewData“的claimData数组。

我试图在浮动面板的collectionView中实现拖放功能,但我似乎无法让itemProvider与我的自定义数据模型一起工作。

这是我目前拥有的:

代码语言:javascript
复制
func collectionView(_ collectionView: UICollectionView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] {
        let item = PageDataSource.sharedInstance.theData?.tableViewReviewData[indexPath.item]
        let itemProvider = NSItemProvider(object: item)
        let dragItem = UIDragItem(itemProvider: itemProvider)
        dragItem.localObject = item
        return [dragItem]
    }

这是我对itemProvider:“参数类型'claimData?‘不符合预期类型'NSItemProviderWriting'"的错误。

谢谢你的帮助,如果你有任何问题,请告诉我!

EN

回答 1

Stack Overflow用户

发布于 2021-07-26 23:08:22

我找到了另一种方法来完成同样的集合视图单元格重新排序操作,该操作可以处理自定义数据,并且设置起来并不难。

代码语言:javascript
复制
@objc func handleLongPressGesture(_ gesture: UILongPressGestureRecognizer) {
        guard let collectionView = myCollectionView else {
            return
        }
        
        switch gesture.state {
        case .began:
            guard let targetIndexPath = collectionView.indexPathForItem(at: gesture.location(in: collectionView)) else {
                return
            }
            collectionView.beginInteractiveMovementForItem(at: targetIndexPath)
            
        case .changed:
            collectionView.updateInteractiveMovementTargetPosition(gesture.location(in: collectionView))
        case .ended:
            collectionView.endInteractiveMovement()
            
        default:
            collectionView.cancelInteractiveMovement()
        }
        
    }
    
    func collectionView(_ collectionView: UICollectionView, canMoveItemAt indexPath: IndexPath) -> Bool {
        return true
    }
    
    func collectionView(_ collectionView: UICollectionView, moveItemAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
        if let item = PageDataSource.sharedInstance.theData?.tableViewReviewData.remove(at: sourceIndexPath.row) {
            PageDataSource.sharedInstance.theData?.tableViewReviewData.insert(item, at: destinationIndexPath.row)
        } else {
            print("The item could NOT be moved!!!")
        }
    }

在viewDidLoad中,只需添加一个长按压手势识别器,如下所示:

代码语言:javascript
复制
let gesture = UILongPressGestureRecognizer(target: self,
                                                   action: #selector((handleLongPressGesture(_:))))
        myCollectionView.addGestureRecognizer(gesture)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68514048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档