ios - Swift:从表中删除 TableView 行而不将其从存储它的数据库中删除

标签 ios swift core-data nsfetchedresultscontroller delete-row

在我的应用程序中,用户可以删除各种表格单元格。如果行被删除,程序将它们的 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 更改,您应该使用 beginUpdatesendUpdates API 来为任何更改设置动画。对于 UI 启动的更改(用户删除行),不需要调用 reloadData

关于ios - Swift:从表中删除 TableView 行而不将其从存储它的数据库中删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31557783/

相关文章:

iOS 推送通知国际化 : payload's "loc-key" and "loc-args"

swift - 使用 For 循环中的变量更改类中的值

ios - 具有 'count' 表达式属性的 CoreData NSFetchRequest 返回 NSManagedObjectID 而不是整数计数

swift - 在 swift 中查询 sqlite 数据库的更好方法

ios - 没有要编译的体系结构(ARCHS=armv7、armv7s、VALID_ARCHS=armv7 armv7s)

ios - 防止滑动 UIPageViewController 时出现的白色间隙

swift - 具有/多个间隔的更新功能(SWIFT)

iphone - 如何使用 StackMob 作为后端获取 sm_owner 用户对象

ios - tableView 添加额外的(空)单元格

ios - 如何定义具有多个特定自定义类型的变量? ( swift )