从UITableView点击后,将附件按钮转到另一个附件

时间:2018-01-20 06:24:18

标签: ios swift uitableview

UITableView允许您指定一个附件 - 如按钮 - 显示在单元格的右侧(documentation)。

在我的音频应用中,我希望允许用户通过点击附件下载,然后使用复选标记显示成功。为了对此进行测试,我只想在配件细节被点击后变成一个复选标记。

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)

    cell.textLabel?.text = TableData[indexPath.row]

// this works, adds a button to right cell 
    cell.accessoryType = .detailDisclosureButton

    return cell
}

override func tableView(_ tableView: UITableView, accessoryButtonTappedForRowWith indexPath: IndexPath) {
    // doSomethingWithItem(indexPath.row)

   // my logic: this function applies when button is tapped. I try to reset the accessory type to checkmark when clicked 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)

    cell.accessoryType = .checkmark

}

这将构建,但会导致以*** Assertion failure in -[UITableView _dequeueReusableCellWithIdentifier:forIndexPath:usingPresentationValues:],

开头的失败

我是Swift的新手,但这看似合乎逻辑:设置一个功能,在点击配件时采取行动,然后将配件设置为复选标记(其中一种配件类型)。

有更好的方法吗?

注意:我不想使用segue或移动到不同的VC;我希望在表格视图中更新UI。

1 个答案:

答案 0 :(得分:2)

您应该在accessoryButtonTappedForRow函数中使用dequeReusableCell,而不是使用cellForRow

阅读文档以了解这两个函数之间的区别,并进一步了解细胞重用的工作原理。 cellForRow(at:)返回特定的UITableViewCell,这是您在这种情况下要查找的内容。

override func tableView(_ tableView: UITableView, accessoryButtonTappedForRowWith indexPath: IndexPath) {
  // doSomethingWithItem(indexPath.row)

  // cellForRow instead of dequeue
  let cell = tableView.cellForRow(at: indexPath)

  cell.accessoryType = .checkmark

}

此外,请确保使用"cell"registerClass

的同一重复标识符var trail = []; var tail = 5; var normal_speed = 1000 / 10 var speed = 1000 / 10; var game_status = 0; var my_game; button.addEventListener("click", function () { clearInterval(my_game); my_game = setInterval(game, speed); }); window.onload = function () { canv = document.getElementById("gc"); context = canv.getContext("2d"); document.addEventListener("keydown", keyPush); document.addEventListener("keyup", keyRelease); } function game() { for (var i = 0; i < trail.length; i++) { context.fillRect(trail[i].x * grid_size, trail[i].y * grid_size, grid_size - 2, grid_size - 2); if (trail[i].x == player_x && trail[i].y == player_y) { if (game_status == 0) { tail = 5; } else { endGame(); return; } } } trail.push({ x: player_x, y: player_y }); while (trail.length > tail) { trail.shift(); } } function keyPush(keyEvent) { switch (keyEvent.keyCode) { case 16: clearInterval(my_game); speed = normal_speed * 0.5; my_game = setInterval(game, speed); break; } } function keyRelease(keyEvent) { switch (keyEvent.keyCode) { case 16: clearInterval(my_game); speed = normal_speed; my_game = setInterval(game, speed); break; } }注册您的单元格