每个UIProgressView的多个UITableViewCell都很慢更新

时间:2017-08-27 07:19:54

标签: swift xcode performance uitableview uiprogressview

我制作的游戏在UITableViewCells中有10 UITableView。 10 UITableViewCells中的每一个都有一个UIProgressView加上许多其他观点。我每1/10秒更新一次UITableView,这非常慢并且在旧设备上滞后。我每隔1/10秒更新一次用户体验,为游戏提供顺畅的进度视图。

有没有办法只更新每个单元格中的进度视图,而不必调用将更新每个单元格中所有视图的tableView.reloadData()

代码示例:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = self.tableView.dequeueReusableCell(withIdentifier: "businessCell", for: indexPath) as! BusinessCell

            cell.progress.progress = Float( businessArray[indexPath.row-1].getCurrentProgress() )

        //lots of other views are updated here

        return cell
    }
}

我可以改变这一行:

cell.progress.progress = Float( businessArray[indexPath.row-1].getCurrentProgress() )

这样的事情:

cell.progress.progress = someVarLocalToViewControllerContainingTableView[indexPath.row]

当我更新这个本地var时,它只会更新progressView或者什么? 我尝试了很多方法,但无法弄清楚如何做到这一点......

2 个答案:

答案 0 :(得分:1)

如果您需要更新特定单元格的进度,请调用此

func reloadProgress(at index: Int) {
     let indexPath = IndexPath(row: index, section: 0)

        if let cell = tableView.cellForRow(at: indexPath) as? BusinessCell {
            cell.progress.progress = Float( businessArray[index - 1].getCurrentProgress() )
        }
}

如果您需要重新加载表格中的所有条形码:

func reloadProgress() {
        for indexPath in tableView.indexPathsForVisibleRows ?? [] {

            if let cell = tableView.cellForRow(at: indexPath) as? BusinessCell {
                cell.progress.progress = Float( businessArray[indexPath.row - 1].getCurrentProgress() )
            }
        }
    }

答案 1 :(得分:0)

你可以使用:

function remover(itemToDelete, items){
  var i       = 0,
      check   = false;
  
  for (var item of items){
    check = Array.isArray(item) ? item.includes(itemToDelete)
                                : item === itemToDelete;
    check ? items.splice(i,1)
          : i++;
  }
  return items;
}

var groceries = ["toothpaste", ["plums", "peaches", "pineapples"], ["carrots", "corn", "green beans"], "orange juice", ["chocolate", "ice cream"], "paper towels", "fish"];

console.log(remover("chocolate", groceries));
console.log(remover("fish", groceries));

而不是使用self.tableView .reloadRows(at: <[IndexPath]>, with: <UITableViewRowAnimation>)

请查看以下链接:

这可能会对您的情况有所帮助。