插入新行时,UITableView会跳转

时间:2018-03-14 18:33:27

标签: ios swift uitableview

我尝试了很多方法来解决这个问题,但我做不到。加载更多数据后,我的tableView会跳转。我在willDisplay

中调用了下载方法
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    let lastObject = objects.count - 1
    if indexPath.row == lastObject {
        page = page + 1
        getObjects(page: page)
    }
}

并在此处插入行:

func getObjects(page: Int) {
    RequestManager.sharedInstance.getObjects(page: page, success: { objects in
        DispatchQueue.main.async(execute: {
            self.objects = self.objects + objects
            self.tableView.beginUpdates()
            var indexPaths = [IndexPath]()
            for i in 0...objects.count - 1 {
                indexPaths.append(IndexPath(row: i, section: 0))
            }
            self.tableView.insertRows(at: indexPaths, with: .bottom)
            self.tableView.endUpdates()
        });
    })
}

那我错了什么?插入新行后为什么tableView会跳转?

4 个答案:

答案 0 :(得分:6)

我遇到与tableViews类似的问题。部分我通过帮助决定了这个

self.tableView.beginUpdates()
self.tableView.endUpdates()

但这并没有解决问题。 对于iOS 11,问题仍然存在。 我添加了一个包含所有单元格高度的数组,并在方法

中使用了这些数据
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return cellHeights[indexPath.row] ?? 0
}

同时添加此方法

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
    return cellHeights[indexPath.row] ?? 0
}

之后,跳跃停止了。

答案 1 :(得分:4)

  

我刚刚找到了停止跳出表格视图的解决方案   在表格视图中插入多行。正面临来自   最后几天,所以终于我解决了这个问题。

     

我们只需要设置表格视图的内容偏移量   在表格视图中插入行。您只需传递您的   您可以使用IndexPath其余的功能。

希望这种方法可以为您提供帮助。

 func insertRows() {
    if #available(iOS 11.0, *) {
        self.tableView.performBatchUpdates({
            self.tableView.setContentOffset(self.tableView.contentOffset, animated: false)
            self.tableView.insertRows(at: [IndexPath], with: .bottom)
        }, completion: nil)
    } else {
        // Fallback on earlier versions
        self.tableView.beginUpdates()
        self.tableView.setContentOffset(self.tableView.contentOffset, animated: false)
        self.tableView.insertRows(at: self.indexPathOfNewPosts(postCountValue: postCountValue), with: .right)
        self.tableView.endUpdates()
    }
}

答案 2 :(得分:1)

首先,检查一下tableView(_:estimatedHeightForRowAt:) - 这将永远不准确,但单元格高度越有可能达到此估计值,表格视图的工作量就越少。

因此,如果您的表格视图中有100个单元格,其中50个单元格肯定会以75的高度结束 - 这应该是估算值。

同样值得一提的是,表格视图可能会向其代表询问确切的单元格高度的次数没有限制。因此,如果您有一个1000行的表视图,那么单元格布局上会出现很大的性能问题(以秒为单位的延迟) - 实现估计会大大减少这些调用。

您需要重新审视单元格设计的第二件事是,是否有任何视图或控件的高度需要由表视图计算?就像一个顶部和底部锚点的图像相当于一个其他高度从一个单元格到另一个单元格变化的视图?

这些视图/控件的固定高度越高,表格视图就越容易布局其单元格。

我对两个表视图有同样的问题,其中一个有一个嵌入到堆栈视图中的可变高度图像,我必须实现估算。另一个没有固定大小的图像,我不需要实现估计以使其平滑滚动。 两个表视图都使用分页。

最后但并非最不重要的是,数组是结构。结构是值类型。所以,也许你不想在阵列中存储任何高度,看看你制作了多少副本? 计算tableView(_:heightForRowAt:)内的高度非常快,效率很高,可以很好地计算出来。

答案 3 :(得分:0)

因为你的循环从0运行到对象计数:

DECLARE @Results TABLE(
     TABLE_CATALOG VARCHAR(50),
     TABLE_SCHEMA VARCHAR(50),
     TABLE_NAME VARCHAR(50),
     COLUMN_NAME VARCHAR(100)
);

INSERT INTO @Results
EXEC sp_MSforeachdb
@command1 = 'USE [?]; SELECT TABLE_CATALOG
                             ,TABLE_SCHEMA
                             ,TABLE_NAME
                             ,COLUMN_NAME
                      FROM INFORMATION_SCHEMA.COLUMNS 
                      WHERE COLUMN_NAME= ''YourColumnName'' ;';

SELECT * FROM @Results

生成的索引路径计数第0行直到对象的计数。因此行被添加到表的顶部(即第0行),因此导致tableview跳转到tableview底部。

尝试将范围更改为:

for i in 0...objects.count - 1 {
     indexPaths.append(IndexPath(row: i, section: 0))
}

希望它有所帮助...... !!!