问题描述
我正在尝试根据我的情况处理出队可重用单元。我不确定我在这里是否以最好的方式做事,我能够处理关于为自定义单元格中的文本标签将单元格出列的奇怪事情。我在单元格 xib 代码中使用 override func prepareForReuse()
处理了这个问题。但是,当我尝试以相同的方式处理单元格背景时,它无法正常工作。我相信这是因为我正在更改 tableView 函数以外的其他地方的单元格背景...
所以问题是单元格背景没有像预期的那样改变,典型的出列可重用单元格问题。如果我将 backgroundColor = nil
放在 prepareForReuse() 中,则背景根本不显示。如果我忽略它,那么当我滚动时,背景颜色会在整个 tableView 中跳跃。
仅供参考,我已在 viewDidLoad() 中正确注册了单元格
我认为这些代码足以解释这种情况。感谢任何指针:)
将单元格背景标记为红色
func markRED(cell: EntrantCell) {
var timeOut: String {
let currentDateTime = Date()
let formatter = DateFormatter()
formatter.timeStyle = .medium
return formatter.string(from: currentDateTime)
}
if let indexPath = self.entrantsTable.returnIndexPath(cell: cell) {
entryStatusGrid[indexPath.row] = 2
entrantTime[indexPath.row].append("OUT- \(timeOut)")
entrantsTable.cellForRow(at: indexPath)?.backgroundColor = #colorLiteral(red: 0.7647058964,green: 0.01910983652,blue: 0.008289327978,alpha: 1)
entrantsTable.reloadData()
}
print(entrantTime)
print(entryStatusGrid)
// Todo: Handle proper space status for global button
Entrant.updateStatus(entryStatusGrid: entryStatusGrid,button: spaceStatus)
}
TableView 扩展
extension EntrySession: UITableViewDataSource {
func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
return entryGrid.count
}
// Todo: Handle proper deque for reusable cells
func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let addEntrantCell = entrantsTable.dequeueReusableCell(withIdentifier: Global.headerCellIdentifier,for: indexPath) as! AddEntrantCell
let entrantCell = entrantsTable.dequeueReusableCell(withIdentifier: Global.bodyCellIdentifier,for: indexPath) as! EntrantCell
if indexPath.row == 0 {
addEntrantCell.delegate = self
addEntrantCell.entrantNameTextField.text = entryGrid[indexPath.row].name
addEntrantCell.entrantCompanyTextField.text = entryGrid[indexPath.row].company
return addEntrantCell
} else {
entrantCell.delegate = self
entrantCell.nameLabel.text = entryGrid[indexPath.row].name
entrantCell.companyLabel.text = entryGrid[indexPath.row].company
return entrantCell
}
}
}
自定义单元格重用()
override func prepareForReuse() {
super.prepareForReuse()
name.text = nil
status.text = nil
backgroundColor = nil // When i do this the background color does not change...
}
override func setSelected(_ selected: Bool,animated: Bool) {
super.setSelected(selected,animated: animated)
}
@IBAction func inButton(_ sender: UIButton) {
delegate?.markRED(cell: self)
}
@IBAction func outButton(_ sender: UIButton) {
delegate?.markBLUE(cell: self)
}
解决方法
您需要始终将其设置为合适的值。
if shouldSetBackgroundColor {
backgroundColor = .brown
} else {
backgroundColor = nil
}
假设您只初始化了 4 个单元格。
然后显示4个单元格。假设所有人都将 shouldSetBackgroundColor
设置为 true
。因此,您会看到所有 4 个单元格的 backgroundColor 都变为 brown
。到目前为止一切顺利。
现在是您的第 5 个单元格。如果您没有在单元格上将 shouldSetBackgroundColor
设置为 false
或者没有一些逻辑来更改 backgroundColor
的颜色,那么由于单元格被重复使用,{{ 1}} 不会改变。它将保持设置为 backgroundColor
...