首页 > 解决方案 > 我想从其他视图控制器(swift)中删除collectionview的单元格

问题描述

无论如何从另一个视图控制器删除collectionview中的单元格,我将数据从CollectionView Cell传递到另一个视图控制器。

我通过这种方式将数据传递给另一个视图控制器。

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let vc = storyboard?.instantiateViewController(withIdentifier: "addViewController") as! addViewController
        vc.name = nameArr[indexPath.row]
        vc.image = imgArr[indexPath.row]
        self.navigationController?.pushViewController(vc, animated: true)
    }

现在我被困住了,我不知道如何从 addViewController 中删除单元格,删除后返回到具有 UICollectionView 的 ViewController 并重新加载它。

像 Instagram 应用程序

标签: swift

解决方案


一个视图控制器不应该直接更新另一个视图控制器的模型和 UIKit 控件。当前的视图控制器应该负责这一点。当前视图控制器应该提供一些机制,以便其他视图控制器可以请求何时应该进行删除。

您可以通过闭包或委托协议模式来做到这一点。例如,如果你想使用闭包,你可以:

  • 给出AddViewController删除对象的闭包:

    class AddViewController: UICollectionViewController {
        var onDelete: (() -> Void)?
        ...
    }
    
  • 当您实例化视图控制器时,设置该闭包:

    extension ViewController: UICollectionViewDelegate {
        func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
            let vc = storyboard?.instantiateViewController(withIdentifier: "addViewController") as! AddViewController
            let item = indexPath.item
            vc.name = nameArr[item]
            vc.image = imgArr[item]
            vc.onDelete = { [weak self]  in
                self?.nameArr.remove(at: item)
                self?.imgArr.remove(at: item)
                collectionView.deleteItems(at: [indexPath])
            }
            navigationController?.pushViewController(vc, animated: true)
        }
    }
    
  • 当该视图控制器需要通知当前视图控制器它应该删除该数据时,它将调用该闭包:

    class AddViewController: UICollectionViewController {
        ...
    
        @IBAction func didTapDeleteButton(_ sender: Any) {
            onDelete?()
        }
    }
    

推荐阅读