取消选择tableView单元格的问题迅速

时间:2019-08-28 15:17:29

标签: swift uitableview

在选择和取消选择在tableView单元格中找到的记录时,出现一个复选标记附件。

我正在执行以下操作:

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        selectRow()
        tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark
    }

问题在于,在首次加载tableView时,如果记录已经存在,则总是需要轻按两下以取消选中复选标记。

    override func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        unselectRow()
        tableView.cellForRow(at: indexPath)?.accessoryType = .none
    }

tableView基于具有以下结构的JSON:

var structure = [JSONStructure]()

struct JSONStructure: Codable {
    var peron: String
    var update: Int
}

如果update的值为100,则如果该值为200,那么将应用复选标记。

这是在cellForRowAt中完成的,如下所示:

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

let TableInfo: JSONStructure

if (TableInfo.update == 100) {
cell.accessoryType = .checkmark
} else {
cell.accessoryType = .none
  }
}

当首次加载tableView并且由于满足update条件而已存在一个复选标记时,如何避免双击以取消选择记录?

2 个答案:

答案 0 :(得分:0)

    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        let cell = tableView.cellForRow(at: indexPath) 
            cell.accessoryType = .none

    }
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
         let cell = tableView.cellForRow(at: indexPath) 
            cell.accessoryType = .checkmark


    }
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("cellData", forIndexPath: indexPath) 
    if (TableInfo.update == 100)
        cell.accessoryType = .Checkmark
        tableView.selectRowAtIndexPath(indexPath, animated: false, scrollPosition: UITableViewScrollPosition.Bottom)
    } else {
        cell.accessoryType = .None
    }

    return cell
}

答案 1 :(得分:0)

您的cellForRowAt仅在视觉上标记了单元格(设置了附件类型),但是您还需要将其标记为UITableView逻辑已选中。在您的代表上实施willDisplay并在那里更新所选状态。示例:

 func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
  // .. get TableInfo for indexPath.row
  let TableInfo: JSONStructure

  if (TableInfo.update == 100) {
    tableView.selectRow(at: indexPath, animated: false, scrollPosition: UITableView.ScrollPosition.none)
  } else {
    tableView.deselectRow(at: indexPath, animated: false)
  }
}

请参见UITableViewCell Set selected initially,尽管某些选项在使用cellForRowAtwillDisplayCell方面有所不同。

有关选择为何使用willDisplaycellForRowAt的原因,请参见iOS UITableView: what's the different between "cellForRowAtIndexPath" and "willDisplayCell: forRowAtIndexPath:"