重新加载

时间:2017-04-03 10:32:32

标签: ios swift uitableview

我每隔几分钟刷新一次UITable,以防有新数据,应该在表格的开头添加,而不是重新加载。

var j = 0
let n = store?.news?.count
while(j < n!){
self.news?.insert((store?.news?[j])!, at: j)
    j = j + 1
}

在第一个位置保存数据没问题。 问题是我不能保持单元格位置在每次重新加载后向上移动(添加的记录数),我尝试了多个功能,但显然它只适用于表格末尾添加的数据。 / p>

let contentOffset = self.tableV.contentOffset
self.tableV.reloadData()
self.tableV.contentOffset = contentOffset

此外,我厌倦了保存单元格位置并添加输入数据的计数,但这种添加不起作用。 有没有办法添加计算的输入数据的数量,让N对indexPath.row?

3 个答案:

答案 0 :(得分:6)

实际上它发生是因为它重新计算了UITableViewAutomaticDimension height

您可以通过存储cell's height来解决此问题,并使用它来为您的单元格estimatedHeightForRowAt分配。
在场景后面,它会将您的确切cell's height分配给estimatedHeightForRowAt。所以重新计算不会波动你的tableview。

实施如下。

// declare dictionary variable for storing heights of cells
var cellHeightsDictionary: [IndexPath: CGFloat] = [:]  

然后 使用tableview的方法willDisplay在您的字典变量中存储单元格的高度 ,并分别在estimatedHeightForRowAt

中指定这些单元格的高度
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        self.cellHeightsDictionary[indexPath] = cell.frame.size.height
    }
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
        if let height =  self.cellHeightsDictionary[indexPath]{
            return height
        }
        return UITableViewAutomaticDimension
    }

就是这样。你完成了。

答案 1 :(得分:0)

为了更好的方法,我认为您可以轻松地在tableview中添加新行,无需重新加载tableview。所以删除self.tableV.reloadData()

    var j = 0
    var arrayIndexPaths : [NSIndexPath] = []
    let n = store?.news?.count
    while(j < n!){
        self.news?.insert((store?.news?[j])!, at: j)

        let indexPath = NSIndexPath(forRow: j, inSection: 0)
        j = j + 1
        arrayIndexPaths.append(indexPath)
    }

    // Now you have array of IndexPaths so you just insert New row like this way.

    self.tableview.beginUpdates()
    self.tableview.insertRowsAtIndexPaths(arrayIndexPaths, withRowAnimation: .None) 
    self.tableview.endUpdates()

更新答案

这样的UITableViewDelegate方法

  func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.news?.count
    }

答案 2 :(得分:0)

我找到了解决问题的方法。由于我在所有表中都有一个单元格大小,我尝试了这种方法:

 self.cell = 143 * CGFloat(n!)
let offset = self.tableV.contentOffset.y + self.cell!
self.tableV.reloadData()
self.tableV.contentOffset.y = offset

我将输入的单元格数(n)添加到contentOffset中,表格在重新加载数据后保持其位置。