删除tableView中的项目会从存储的值中删除错误的相应文件(swift NSCoding)

时间:2018-04-25 13:09:31

标签: ios swift uitableview

我使用下面的代码从TableView中删除项目,并从存档中删除相应的文件。如果我删除TableView的第4项,它将删除存储值的第4个文件。由于TableView是动态的(排序项目或更改它显示的项目数)并且存档是稳定的,因此代码会删除错误的文件,因为视图中的第1项可能是存储文件中的第6项。因此,当重新加载视图时,项目将被删除,但不会删除我想要的项目。 (我使用NSCoding来存储值)。每个项目都有一个唯一的ID,每个文件都有一个唯一的名称(即id),但我只能检索真正删除的项目的ID,而不是我要刷卡删除的项目。请你帮助我好吗?谢谢。

self.tableOfExpences.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .fade)

//REMOVING FROM THE STORED VALUES================         

let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
 let paths:[String] = Bundle.paths(forResourcesOfType: "dat", inDirectory: documentsPath)
        if paths.count > 0 {
             do {
                try FileManager.default.removeItem(atPath: paths[indexPath.row])
                print("deleted File has been removed")
                } catch {
                print("an error during a removing")
                }
        }



    } else if editingStyle == .insert {
        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
    }    
}

尝试解决可能的同步问题

首先,我确保表视图知道它显示的内容。并且看起来阵列已同步。 在调试区域,我读到:

  

第一个单元格是可选(“巧克力”)并且ID为可选( 6

     

第二个单元格是可选(“手机”)并且ID为可选( 7

以上是正确的。

然后我滑动以使用 ID 7 删除第二个单元格(手机),它通知我将删除与另一个ID和另一个路径完全不同的费用。

对于上述问题,解决方案附带[indexPath.row-1]而不是[indexPath.row]。

     if indexPath.row == 0 {

            self.tableOfExpences.remove(at: indexPath.row)
            tableView.deleteRows(at: [indexPath], with: .fade)

        } else {
        self.tableOfExpences.remove(at: indexPath.row-1)
        tableView.deleteRows(at: [indexPath], with: .fade)
        }

上述解决方案有效,但当我删除最后一项时,应用程序崩溃了。所以在看了类似的问题之后,解决方案是回到[indexPath.row]而不是[indexPath.row-1]并且只是反转行的顺序,以便首先从文件中删除数据

    try FileManager.default.removeItem(atPath: paths[indexPath.row])

然后实现

   self.tableOfExpences.remove(at: indexPath.row) 

我希望以上内容可以帮助有类似问题的人。当然没有filePth属性和同步debuging我仍然会看到代码崩溃。谢谢你的帮助。这是一个美好的一周。

3 个答案:

答案 0 :(得分:0)

修改您的费用模型以获得路径属性。当您创建费用并将其存储到文件系统时,存储该费用的路径,并在以后要删除费用时使用它

struct Expense {
    let filePath: String
    // .... other properties
}

然后你可以打电话:

try FileManager.default.removeItem(atPath: expenses[indexPath.row].filePath)

答案 1 :(得分:0)

问题可能是由于您的两个阵列不同步造成的。

当您通过获取Documents目录中的文档来获取paths数组时,您无法保证它们将以与表数据相同的排序顺序返回。

您也可以添加费用模型的路径,这样会更可靠

答案 2 :(得分:0)

您需要对路径进行排序,就像表中的项目已排序一样。

Bundle.paths(forResourcesOfType: "dat", inDirectory: documentsPath).a.sorted { $0 < $1 } // your logic sorting