错误:UITableView使用UITableViewAutomaticDimension跳转到顶部

Tap*_*Pal 17 core-data uitableview ios swift uitableviewautomaticdimension

我使用UITableViewestimatedRowHeightUITableViewAutomaticDimension.我也用它NSFetchedResultsControllerDelegate来反映变化.

一切都很好.现在的问题是,当我添加一些记录时CoreData,NSFetchedResultsController称为它的委托,但意外的事情发生.每次TableView突然滚动到Top.

NSFetchedResultsControllerDelegate

func controllerWillChangeContent(controller: NSFetchedResultsController) {
    tableView.beginUpdates()
}

func controllerDidChangeContent(controller: NSFetchedResultsController) {
    tableView.endUpdates()
}

func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) {
        switch type {
        case .Insert:
            tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: .None)
            break

        case .Update:
            tableView.reloadRowsAtIndexPaths([indexPath!], withRowAnimation: .None)
            break

        case .Delete:
            tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: .None)
            break

        default: break;
        }
    }
Run Code Online (Sandbox Code Playgroud)

通过谷歌搜索我发现很少有人建议使用的答案,tableView: heightForRowAtIndexPath:但因为我的细胞高度是动态的.所以我该怎么做?

Dev*_*del 7

这是tableview的默认行为,在tableview中插入一行将其滚动到顶部.我确实遇到了与我的应用程序相同的问题.以下是我如何管理tableview的内容偏移量,按照步骤,

1)在插入行或节之前存储UITableview的内容偏移量.

2)在数组中插入对象.

3)重新加载tableview

4)减去差值并手动设置内容偏移量.

let oldOffset: CGFloat = tblTest.contentSize.height
tblTest.reloadData()
let newOffset: CGFloat = tblTest.contentSize.height
tblTest.setContentOffset(CGPointMake(0, (newOffset - oldOffset)), animated: false)
Run Code Online (Sandbox Code Playgroud)

这就是我到目前为止在我的应用程序中所做的工作,并且每次都使用动态单元来克服重新初始化的单元格,它的工作非常棒.


Jay*_*iya 1

tableView.reloadData()
if tableView.numberOfRowsInSection(0) > 0
{
      let indexPath = NSIndexPath(forRow: 0, inSection: 0)
      self. tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Top, animated: true)
}
Run Code Online (Sandbox Code Playgroud)