表更新时 NSFetchedResultsController 无法滚动

Posted

技术标签:

【中文标题】表更新时 NSFetchedResultsController 无法滚动【英文标题】:NSFetchedResultsController can't scroll while table updating 【发布时间】:2016-03-01 14:43:48 【问题描述】:

我有一个 tableViewNSFetchedResultsController 来监听项目更新。

func controllerWillChangeContent(controller: NSFetchedResultsController) 
        self.tableView.beginUpdates()
    

 func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) 

        switch type 
            case .Insert:
                if let _newIndexPath = newIndexPath 
                    self.tableView.insertRowsAtIndexPaths([_newIndexPath], withRowAnimation: .None)
                
            case .Delete:
                if let _indexPath = indexPath 
                    self.tableView.deleteRowsAtIndexPaths([_indexPath], withRowAnimation: .None)
                
            case .Update:
                if let _indexPath = indexPath 
                    self.tableView.reloadRowsAtIndexPaths([_indexPath], withRowAnimation: .None)
                
            default:
                self.tableView.reloadData()
        

        self.items = controller.fetchedObjects as! [Item]
    

func controllerDidChangeContent(controller: NSFetchedResultsController) 
        self.tableView.endUpdates()
    

当用户添加项目时,我每 1-2 秒在数据库中更新一次,我无法向下滚动,因为控制器刷新项目并将我滚动到顶部。

【问题讨论】:

您是否也实现了controllerWillChangeContentcontrollerDidChangeContent 是的,我更新了答案 所以你不能向下滚动,因为你的 tableView 正在重新加载并带你回到顶部? 我打印了结果:更新,每次都调用方法...所以应该只更新一行 只是好奇.. 如果您要插入和删除行,为什么没有 rowAnimation?摆脱self.tableView.reloadData() 看看是否能解决您的问题...您不需要重新加载整个tableView 数据,因为您已经使用insertRowsAtIndexPathsdeleteRowsAtIndexPathsreloadRowsAtIndexPaths 方法更新它...那是多余的,可能是您的问题的原因 【参考方案1】:

我发现了问题。这是因为我使用:

self.tableView.rowHeight = UITableViewAutomaticDimension

感谢您的回答:UITableView bouncing back to the top of a section when calling reloadRowsAtIndexPaths

【讨论】:

【参考方案2】:

您是否尝试过删除默认大小写?每次项目移动时,它都会重新加载您的表格视图。

尝试像这篇文章中描述的那样实现 .Move 案例:http://www.raywenderlich.com/999/core-data-tutorial-for-ios-how-to-use-nsfetchedresultscontroller。

【讨论】:

可能需要检查单元格是否可见?

以上是关于表更新时 NSFetchedResultsController 无法滚动的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 触发器用于在更新当前表中的值时更新另一个表

创建一个触发器,当另一个表中的列更新时更新一个表上的列

每次更新表时运行大查询计划

如何更新链接到多个表的 FK - 更新时的级联

在运行时更新悖论表

表更新时 NSFetchedResultsController 无法滚动