[Beginner] how to save data in collectionview

Hi everyone,

I'm new here and I'm beginner with swift.
I have create a collection view wich can perform drag and drop.
But now I need your help!
I'm trying to save data from my cell (UItextField) in my array dataTask.

i have trying something like this, but it's pretty bad... Can you give me some help?
thanks a lot!

this is my class Task, my data array is of type Task

class Task: NSObject, Codable, NSItemProviderReading, NSItemProviderWriting {
    var task: String?
    var button: Bool?
    init(task: String, button: Bool) {
        self.task = task
        self.button = button
    static var writableTypeIdentifiersForItemProvider: [String] {
        return [(kUTTypeData) as String]

    func loadData(withTypeIdentifier typeIdentifier: String, forItemProviderCompletionHandler completionHandler: @escaping (Data?, Error?) -> Void) -> Progress? {

        let progress = Progress(totalUnitCount: 100)

        do {
            let encoder = JSONEncoder()
            encoder.outputFormatting = .prettyPrinted
            let data = try encoder.encode(self)
            let json = String(data: data, encoding: String.Encoding.utf8)
            progress.completedUnitCount = 100
            completionHandler(data, nil)
        } catch {

            completionHandler(nil, error)

        return progress
    static var readableTypeIdentifiersForItemProvider: [String] {
        return [(kUTTypeData) as String]
    static func object(withItemProviderData data: Data, typeIdentifier: String) throws -> Self {
        let decoder = JSONDecoder()
        do {
            let myJSON = try decoder.decode(Task.self, from: data)
            return myJSON as! Self
        } catch {

This is my drag and drop

extension LTHM_Todo: UICollectionViewDragDelegate, UICollectionViewDropDelegate {
    func collectionView(_ collectionView: UICollectionView, dropSessionDidUpdate session: UIDropSession, withDestinationIndexPath destinationIndexPath: IndexPath?) -> UICollectionViewDropProposal {
        if collectionView.hasActiveDrag {
            return UICollectionViewDropProposal(operation: .move, intent: .insertAtDestinationIndexPath)
        return UICollectionViewDropProposal(operation: .forbidden)
    func collectionView(_ collectionView: UICollectionView, performDropWith coordinator: UICollectionViewDropCoordinator) {
        var destinationIndexPath: IndexPath
        if let indexPath = coordinator.destinationIndexPath {
            destinationIndexPath = indexPath
        } else {
            let row = collectionView.numberOfItems(inSection: 0)
            destinationIndexPath = IndexPath(item: row - 1, section: 0)
        if coordinator.proposal.operation == .move {
            self.reorderItem(coordinator: coordinator, destinationIndexPath: destinationIndexPath, collectionView: collectionView)
    fileprivate func reorderItem(coordinator: UICollectionViewDropCoordinator, destinationIndexPath: IndexPath, collectionView: UICollectionView) {
        if let item = coordinator.items.first,
           let sourceIndexPath = item.sourceIndexPath {
                self.dataArray.remove(at: sourceIndexPath.item)
                self.dataArray.insert(item.dragItem.localObject as! Task, at: destinationIndexPath.item)
                collectionView.deleteItems(at: [sourceIndexPath])
                collectionView.insertItems(at: [destinationIndexPath])
            }, completion: nil)
            coordinator.drop(item.dragItem, toItemAt: destinationIndexPath)
    func collectionView(_ collectionView: UICollectionView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] {
        let item = self.dataArray[indexPath.row]
        let itemProvider = NSItemProvider(object: item)
        let dragItem = UIDragItem(itemProvider: itemProvider)
        dragItem.localObject = item
        return [dragItem]


And here... I'm not sure about that, but I'm trying to refresh the data in the cell

extension LTHM_Todo: UICollectionViewDataSource {
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: MyCollectionViewCell.identifier, for: indexPath as IndexPath) as! MyCollectionViewCell
//        let newTask = Task(task : "", button: false)
//        newTask.task = cell.myText.text
//        dataArray[indexPath.row] = newTask

        return cell

Thanks a lot again!

Terms of Service

Privacy Policy

Cookie Policy