Swift:从表中删除表视图行而不将其从数据库中删除它存储在

时间:2015-07-22 08:26:40

标签: ios swift core-data nsfetchedresultscontroller delete-row

在我的应用程序中,用户可以删除各种表格单元格。如果删除行,程序会将其ID存储在名为deletedFeeds的数组中,该数组使用NSUserDefaults。该程序显示来自Core Data数据库的信息,该数据库经常更新。这是从数据库中获取信息的代码。它会检查以确保它所查找的对象不在已删除的Feed数组中,以确保它尚未被删除。

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()
    }
}

1 个答案:

答案 0 :(得分:1)

如上所述,您正在滥用NSUserDefaults。唐'吨。

已删除Feed的信息属于您的数据库。您可以添加跟踪该属性的属性。

现在,删除行时,只需将deleted标记设置为true即可。

另请注意,reloadData是更新表格视图的粗略方式。对于因数据外部更改而导致的表格视图更改,您应使用beginUpdatesendUpdates API为所有更改设置动画。对于UI发起的更改(用户删除行),调用reloadData是必需的。