有一个由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")
}
}
答案 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)
}