You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift 3中如何移除数组内模型类数据并更新Collection View?

解决CollectionView点击删除按钮移除对应数据的问题

我来帮你把这个删除逻辑补全并理顺,按照你的代码思路,完整的实现步骤如下:

1. 完善IndexPath的获取与解包

你已经通过按钮位置转换获取CollectionView内的坐标,但需要完整获取并安全解包indexPath,避免可选值引发的崩溃:

@objc func deleteAction(sender : UIButton){
    // 将按钮的原点坐标转换为CollectionView的坐标系统
    let buttonPosition = sender.convert(CGPoint.zero, to: cartCollectionView)
    // 根据坐标获取对应的indexPath,用guard确保拿到有效索引
    guard let indexPath = cartCollectionView.indexPathForItem(at: buttonPosition) else {
        // 如果获取不到indexPath(比如按钮不在cell范围内),直接返回
        return
    }
    
    // 后续删除逻辑写在这里
}

2. 移除数组中的对应模型数据

拿到正确的indexPath后,直接从你的数据源数组里移除对应位置的元素:

// 从cartItemsModel数组中删除对应索引的模型
cartItemsModel.remove(at: indexPath.item)

3. 更新CollectionView界面

为了让界面和数据源保持一致,同时给用户流畅的删除动画体验,调用CollectionView的删除方法(注意UI操作必须在主线程执行):

DispatchQueue.main.async {
    self.cartCollectionView.deleteItems(at: [indexPath])
}

完整的删除按钮Action代码

把上面的步骤整合起来,最终的完整代码如下:

@objc func deleteAction(sender : UIButton){
    let buttonPosition = sender.convert(CGPoint.zero, to: cartCollectionView)
    guard let indexPath = cartCollectionView.indexPathForItem(at: buttonPosition) else {
        return
    }
    
    // 移除数据源中的数据
    cartItemsModel.remove(at: indexPath.item)
    
    // 更新CollectionView界面
    DispatchQueue.main.async {
        self.cartCollectionView.deleteItems(at: [indexPath])
    }
}

额外注意事项

  • 确保你的CollectionView数据源方法(numberOfItemsInSection、cellForItemAt)都是基于cartItemsModel数组返回数据的,这样删除后界面才会正确同步。
  • 如果删除按钮是放在CollectionViewCell内部的,记得在cell复用或绑定事件时使用weak self,避免循环引用问题。

内容的提问来源于stack exchange,提问作者User

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:34:54