如何更改未使用 rx swift 选择的单元格的背景颜色?
How do I change background color on cells that are not selected using rx swift?
为了在选定的 cell
上设置颜色,我执行以下操作:
armSystemTableView.rx.itemSelected.subscribe(onNext: { indexPath in
let cell = self.armSystemTableView.cellForRow(at: indexPath) as? TechnicianArmSystemTableViewCell
cell?.backgroundColor = .green
}).disposed(by: disposeBag)
虽然这有效,但它不会删除所有其他 cells
上的选择颜色,这意味着我单击的每个 cell
都会变成绿色。如何将所有未选中的 cells
恢复为原来的颜色?
我也尝试过使用 override func setSelected(_ selected: Bool, animated: Bool)
但它不能与设置默认选择 cell
一起使用,因为我认为 setSelected
会覆盖默认值:
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)
这里我设置默认选中cell
。但它不起作用,我认为原因是它被 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
}
}
默认情况下应该有一个 cell
标记的贪婪,但没有。如果我删除 setSelected
并更改为设置背景颜色,它将使用默认选择的 cell
:
...
if row == cell.viewModel?.parameter.value {
cell.backgroundColor = .green
} else {
cell.backgroundColor = .red
}
那么我该如何实现呢?看起来很简单:当您输入 view
时,一个 cell
应该被标记为绿色。选择任何其他cell
时,cell
将变为绿色,任何其他cell
都会变成红色。
我找到了一个方法。循环所有可见的 cells
并更改每个的颜色,然后在特定单元格上设置颜色。我想这不是最漂亮的,但它确实有效:
armSystemTableView.rx.itemSelected.subscribe(onNext: { indexPath in
self.armSystemTableView.visibleCells.forEach { [=10=].backgroundColor = .tableviewBackgroundColor }
let cell = self.armSystemTableView.cellForRow(at: indexPath) as? TechnicianArmSystemTableViewCell
cell?.backgroundColor = .selectedCellColor
}).disposed(by: disposeBag)
这里有一个更像 Rx 的方法:
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)
您需要定义它才能使上述工作正常进行:
extension Reactive where Base: UITableViewCell {
var setSelected: Observable<(selected: Bool, animated: Bool)> {
base.rx.methodInvoked(#selector(UITableViewCell.setSelected(_:animated:)))
.map { (selected: [=11=][0] as! Bool, animated: [=11=][1] as! Bool) }
}
}
为了在选定的 cell
上设置颜色,我执行以下操作:
armSystemTableView.rx.itemSelected.subscribe(onNext: { indexPath in
let cell = self.armSystemTableView.cellForRow(at: indexPath) as? TechnicianArmSystemTableViewCell
cell?.backgroundColor = .green
}).disposed(by: disposeBag)
虽然这有效,但它不会删除所有其他 cells
上的选择颜色,这意味着我单击的每个 cell
都会变成绿色。如何将所有未选中的 cells
恢复为原来的颜色?
我也尝试过使用 override func setSelected(_ selected: Bool, animated: Bool)
但它不能与设置默认选择 cell
一起使用,因为我认为 setSelected
会覆盖默认值:
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)
这里我设置默认选中cell
。但它不起作用,我认为原因是它被 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
}
}
默认情况下应该有一个 cell
标记的贪婪,但没有。如果我删除 setSelected
并更改为设置背景颜色,它将使用默认选择的 cell
:
...
if row == cell.viewModel?.parameter.value {
cell.backgroundColor = .green
} else {
cell.backgroundColor = .red
}
那么我该如何实现呢?看起来很简单:当您输入 view
时,一个 cell
应该被标记为绿色。选择任何其他cell
时,cell
将变为绿色,任何其他cell
都会变成红色。
我找到了一个方法。循环所有可见的 cells
并更改每个的颜色,然后在特定单元格上设置颜色。我想这不是最漂亮的,但它确实有效:
armSystemTableView.rx.itemSelected.subscribe(onNext: { indexPath in
self.armSystemTableView.visibleCells.forEach { [=10=].backgroundColor = .tableviewBackgroundColor }
let cell = self.armSystemTableView.cellForRow(at: indexPath) as? TechnicianArmSystemTableViewCell
cell?.backgroundColor = .selectedCellColor
}).disposed(by: disposeBag)
这里有一个更像 Rx 的方法:
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)
您需要定义它才能使上述工作正常进行:
extension Reactive where Base: UITableViewCell {
var setSelected: Observable<(selected: Bool, animated: Bool)> {
base.rx.methodInvoked(#selector(UITableViewCell.setSelected(_:animated:)))
.map { (selected: [=11=][0] as! Bool, animated: [=11=][1] as! Bool) }
}
}