我CoreData用a NSFetchResultController来显示数据UITableView.我有一个问题:UITableView更改contentOffSet.y插入/移动/删除新行的时间.当用户滚动到例如中间时,UITableView当插入新行时弹跳.
这个github链接到一个项目,其中包含重现此行为的最小代码:https://github.com/Jasperav/FetchResultControllerGlitch(代码也在下面)
这显示了故障.我站在我的中间,我UITableView不断看到插入新行,无论当前contentOffSet.y.
当NSFetchedResultsController添加新记录时,如何阻止向上滚动UITableView?
不相关,因为我明确设置rowHeight和
estimatedRowHeight.
错误:UITableView跳转到顶部,UITableViewAutomaticDimension
在endUpdates没有运气之前尝试了这个
UITableView由带有UITableViewAutomaticDimension的FetchedResultsController提供 - 当重新加载表时单元格移动
与第一个链接相同,我设置了rowHeight和
estimatedRowHeight.
我也试过切换到,performBatchUpdates而不是begin/endUpdates,也没有解决.
在UITableView插入时/删除/移动行时只是应保持不动那些行不可见的用户.我希望这样的东西应该开箱即用.
这是我最终想要的(只是复制WhatsApp的聊天屏幕):
UITableView应该为新插入的行设置动画并更改当前contentOffSet.y.如果a UICollectionView更合适,那就没问题了.
我想复制WhatsApp聊天屏幕.我不确定他们是否使用NSFetchResultController,但除此之外,最终目标是为他们提供确切的用户体验.因此,插入,移动,删除和更新单元格应该按照WhatsApp的方式进行.因此,对于一个工作示例:转到WhatsApp,获取一个不工作的示例:下载项目.
代码(ViewController.swift):
import CoreData
import UIKit
class ViewController: UIViewController, NSFetchedResultsControllerDelegate, …Run Code Online (Sandbox Code Playgroud) 目前的设置:
TableView具有自动计算的高度:
self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension;
self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 152.0;
self.tableView.estimatedSectionHeaderHeight = 50.0;
Run Code Online (Sandbox Code Playgroud)
只要获取的结果控制器更新其数据,就会重新加载tableview:
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
[self.tableView reloadData];
}
Run Code Online (Sandbox Code Playgroud)
使用Xib配置单元.第一个标签固定在单元格的顶部,每个标签都固定在其上方标签的顶部,底部的标签固定在单元格的底部.
问题:
每次我在表视图中的项目上设置"收藏夹"属性时,将触发提取的结果控制器以重新加载表格并更改滚动位置.这是我想要修复的滚动位置的这种变化.
附加信息
如果我使用固定单元格高度它解决了问题但我需要UITableViewAutomaticDimension,因为第一个标签可以包裹两条线,其余标签可能存在也可能不存在.
例
注意 - 当我选择Fav按钮时,它在Core数据中设置fav属性并重新加载表.桌子为什么跳来跳去?

UITableView一旦我向CoreData添加新评论,我就会向上滚动.NSFetchedResultsController知道它,将此注释放在表的底部,并将表滚动到顶部.这是正常的吗?
我的例子:
就在我添加评论之前:
在我添加评论(不是预期的行为)之后:
它应该是这样的(在我手动手动滑动之后):
这可能与以下情况有关:
这是我的排序描述符NSFetchedResultsController:
NSSortDescriptor(key: "createdAt", ascending: false) //from the latest to the oldest
Run Code Online (Sandbox Code Playgroud)但是我需要显示反向索引路径的注释(最新版本位于最底层).换句话说,在我需要使用的任何地方,indexPath我都使用:
private func reversedIndexPathForIndexPath(indexPath: NSIndexPath) -> NSIndexPath {
return NSIndexPath(forRow: fetchedResultsController.fetchedObjects!.count - indexPath.row - 1, inSection: 0)
}
Run Code Online (Sandbox Code Playgroud)NSFetchedResultsControllerDelegate:
//MARK: - NSFetchedResultsControllerDelegate
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 …Run Code Online (Sandbox Code Playgroud)