为什么insertRowsAtIndexPaths总是导致TableView滚动到顶部?

时间:2016-02-21 22:53:48

标签: ios swift uitableview

我一直在为这个问题敲打几个小时,但每次我尝试这样的事情:

    self.dataArray.append(newCellObj)

然后我这样做:

    self.tableView.beginUpdates()
    self.tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Top)
    self.tableView.endUpdates()

UITableView将自动滚动到页面顶部。

即使我尝试:

    self.tableView.scrollEnabled = false
    self.tableView.beginUpdates()
    self.tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Top)
    self.tableView.endUpdates()

即使滚动完全禁用,UITableView仍会滚动到顶部。究竟是什么原因导致ScrollView在调用insertRowsAtIndexPaths后滚动到顶部?

我对这个问题的唯一解决方案就是使用它:

    self.tableView.reloadData()

代替。如果我使用reloadData而不是它很好,但是我失去了我想要保留的漂亮动画。

我也有self.tableView.scrollsToTop = false而且我尝试过许多其他可能会以某种方式禁用滚动的配置,但是,在insertRowsAtIndexPaths

之后有一些事情会覆盖它

2 个答案:

答案 0 :(得分:13)

我遇到了与OP相同的问题。另外,有时候我的一些桌面视图单元格会出现空白"并完全消失,这导致我this related question

对我来说,解决方案是执行以下操作之一:

  • 实施func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
  • 禁用自动布局
  • estimatedRowHeight
  • 上设置更准确的UITableView

答案 1 :(得分:1)

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
{
     return UITableViewAutomaticDimension;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
     return UITableViewAutomaticDimension;
}

// I'm use auto layout and this variant without animation works 
// ...insert object to datasource
NSUInteger idx = [datasource indexOfObject:myNewObject];
if ( NSNotFound != idx )
{
    NSIndexPath *path = [NSIndexPath indexPathForRow:idx inSection:0];
    [self.table beginUpdates];
    [self.table insertRowsAtIndexPaths:@[path]
                      withRowAnimation:UITableViewRowAnimationNone];
    [self.table endUpdates];
    [self.table scrollToRowAtIndexPath:path 
                      atScrollPosition:UITableViewScrollPositionBottom 
                              animated:NO];
}