在我的应用程序中,用户可以删除各种表格单元格。如果行被删除,程序将它们的 id 存储在一个名为 deletedFeeds 的数组中,该数组使用 NSUserDefaults。该程序显示来自 Core Data 数据库的信息,该数据库经常更新。这是从数据库中获取信息的代码。它会检查以确保它正在查找的对象不在已删除提要的数组中,以确保它没有被删除。
var fetchResultController: NSFetchedResultsController = NSFetchedResultsController()
func getFetchedResultController() -> NSFetchedResultsController {
fetchResultController = NSFetchedResultsController(fetchRequest: feedFetchRequest(), managedObjectContext: managedObjectContext!, sectionNameKeyPath: nil, cacheName: nil)
return fetchResultController
}
func feedFetchRequest() -> NSFetchRequest {
let fetchRequest = NSFetchRequest(entityName: "Feed")
let sortDescriptor = NSSortDescriptor(key: "url", ascending: false)
let predicateOne = NSPredicate(format: "category == %@", theUrl!)
let predicateTwo = NSPredicate(format: "not (%@ contains[c] url)", deletedFeeds)
let predicate = NSCompoundPredicate(type: NSCompoundPredicateType.AndPredicateType, subpredicates: [predicateOne, predicateTwo])
fetchRequest.predicate = predicate
fetchRequest.sortDescriptors = [sortDescriptor]
return fetchRequest
}
问题是,我在删除行时无法手动更新获取请求,因此当数组在删除行后尝试生成单元格时会超出索引,因为它仍然期望与之前一样多的行该行已被删除。我怎样才能解决这个问题?这是删除行的代码:
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if editingStyle == .Delete {
let item = fetchResultController.objectAtIndexPath(indexPath) as! Feed
deletedFeeds.append(item.url)
fetchResultController.performFetch(nil)
tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
tableView.reloadData()
}
}
最佳答案
如前所述,您正在滥用 NSUserDefaults
。不。
已删除提要的信息属于您的数据库。您可以添加一个属性来跟踪它。
现在,当您删除一行时,只需将 deleted 标志设置为 true 即可。
另请注意,reloadData
是一种更新 TableView 的粗略方法。对于由于数据的外部更改而导致的 TableView 更改,您应该使用 beginUpdates
和 endUpdates
API 来为任何更改设置动画。对于 UI 启动的更改(用户删除行),不需要调用 reloadData
。
关于ios - Swift:从表中删除 TableView 行而不将其从存储它的数据库中删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31557783/