我使用下面的代码从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我仍然会看到代码崩溃。谢谢你的帮助。这是一个美好的一周。
答案 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