In order to set a color on a selected cell I do the following:
armSystemTableView.rx.itemSelected.subscribe(onNext: { indexPath in
let cell = self.armSystemTableView.cellForRow(at: indexPath) as? TechnicianArmSystemTableViewCell
cell?.backgroundColor = .green
}).disposed(by: disposeBag)
While this works, it doesn't remove the selection color on all other cells, meaning that every cell I click will turn green. How do I restore all the unselected cells to their original color?
I also tried using override func setSelected(_ selected: Bool, animated: Bool) but that didn't work in conjunction with setting a default selected cell as I think setSelected overrides the default:
armSystemViewModel.content.bind(to: armSystemTableView.rx.items(cellIdentifier: TechnicianArmSystemTableViewCell.identifier, cellType: TechnicianArmSystemTableViewCell.self)) {
row, data, cell in
cell.viewModel = data
if row == cell.viewModel?.parameter.value {
cell.setSelected(true, animated: false)
} else {
cell.setSelected(false, animated: false)
}
}.disposed(by: disposeBag)
Here I set the default selected cell. But it won't work and I think the reason is that it's overriden by setSelected:
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
setSelectedColors(selected: selected)
}
func setSelectedColors(selected: Bool) {
if selected {
contentView.backgroundColor = .green
} else {
contentView.backgroundColor = .red
}
}
There should be a cell marked greed per default, but there isn't. If I remove setSelected and change to setting the background color it will work with the default selected cell:
...
if row == cell.viewModel?.parameter.value {
cell.backgroundColor = .green
} else {
cell.backgroundColor = .red
}
So how do I make this happen? Seems simple enough: one cell should be marked green when you enter the view. When selecting any other cell that cell will instead become green and any other cell will become red.
CodePudding user response:
I found a way. Loop all visible cells and change the color on each, then set the color on a specific cell. Not the prettiest I suppose, but it does work:
armSystemTableView.rx.itemSelected.subscribe(onNext: { indexPath in
self.armSystemTableView.visibleCells.forEach { $0.backgroundColor = .tableviewBackgroundColor }
let cell = self.armSystemTableView.cellForRow(at: indexPath) as? TechnicianArmSystemTableViewCell
cell?.backgroundColor = .selectedCellColor
}).disposed(by: disposeBag)
CodePudding user response:
Here's a more Rx'ish way to do it:
items
.bind(to: tableView.rx.items) { (tableView, row, element) in
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")!
cell.textLabel?.text = "\(element) @ row \(row)"
cell.rx.setSelected
.subscribe(onNext: { [contentView = cell.contentView] selected, animated in
contentView.backgroundColor = selected ? .green : .white
})
.disposed(by: cell.disposeBag)
return cell
}
.disposed(by: disposeBag)
You will need to define this to get the above to work:
extension Reactive where Base: UITableViewCell {
var setSelected: Observable<(selected: Bool, animated: Bool)> {
base.rx.methodInvoked(#selector(UITableViewCell.setSelected(_:animated:)))
.map { (selected: $0[0] as! Bool, animated: $0[1] as! Bool) }
}
}
