如何从数组的已知索引(整数)而不是从IndexPath获取UITableViewCell?

时间:2019-07-15 16:10:08

标签: swift uitableview indexpath

有一个由50个元素组成的数组data,我将它们显示在UITable视图上。我在每个UITableViewCell上都有一个按钮,当我单击该按钮时,通过向其添加边框来突出显示该单元格。高亮显示的单元格中的数据存储在另一个数组highlightedData中。 highlightedData数组的长度始终为2,因为我只希望表视图中突出显示两个单元格。当选择第三个单元格时,我将删除元素highlightedData.remove(at: 1)并将新数据添加到highlightedData中的第三个单元格中。我想从highlightedData数组中删除数据时删除该单元格的边框。有没有一种方法可以基于data数组中数据的索引从表视图中获取该单元格?我不希望由indexPath返回的单元格而是由integer返回的单元格。

这是我的代码,用于更好地理解:

func buttonClicked(_ cell: ExampleTableViewCell) {
        guard let indexPath = tableView.indexPath(for: cell) else {
            return
        }
        if highlightedData.count == 2 {
                 // here I want to get the cell of the element at the index: Int = data.indexOf([highlightedData[1]])
                 highlightedData.remove(at: 1)
                }
            highlightedData.append(data[indexPath.row])
        if highlightedData.count == 2 {
            print("open a new vc")
        }
    }

2 个答案:

答案 0 :(得分:0)

cellForRowAt内部以来,您应该有类似的东西

// suppose border for someView
cell.someView.layer.borderWidth = highlightedData.contains(indexPath.row) ? 2 : 0

然后仅重新加载buttonClicked的表末尾,您也可以这样做

if let cell = tableView.cellForRow(at: IndexPath(row:highlightedData[1], section: 0)) as? ExampleTableViewCell {
    print(cell)
}

,但不建议您这样做,因为您当前所做的更改会从单元格中删除边框,并将其添加到另一个边框中,通过重新加载即可

答案 1 :(得分:0)

您还可以为var isSelected覆盖UITableViewCell变量,并执行以下操作:

// UITableViewCell
override isSelected: Bool {
     didSet {
          layer.borderWidth = isSelected ? 2 : 0
     }
}

然后,您将使用表视图单元格func setSelected(_ selected: Bool, animated: Bool)方法来选择单元格。这样将自动处理外观,而无需重新加载整个表格视图,并且您可以通过一种方法灵活地选择或取消选择单元格。

您将在buttonClicked函数中使用该方法来选择和取消选择正确的两个单元格。像这样:

func buttonClicked() {

     guard let indexPath = tableView.indexPath(for: cell) else {
            return
     }

     if highlightedData.count == 2 {       
          highlightedData.remove(at: 0)
          tableView.cellForRow(at: IndexPath(row:highlightedData[0], section: 0)).setSelected(false, animated: false)
     }

      highlightedData.append(data[indexPath.row])
      tableView.cellForRow(at: IndexPath(row:highlightedData.last!, section: 0)).setSelected(true, animated: false)

}