Swift:从 table 中删除 table 视图行,而不将其从存储它的数据库中删除

Swift: Delete a table view row from a table without removing it from the database it is stored in

在我的应用程序中,用户可以删除各种 table 单元格。如果行被删除,程序将它们的 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 是更新 table 视图的粗略方法。对于由于数据的外部变化而导致的 table 视图的变化,您应该使用 beginUpdatesendUpdates API 来动画化任何变化。对于 UI 发起的更改(用户删除行),应该 而不是 有必要调用 reloadData