如何更改未使用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将变为红色。

这里有一种更Rx'ish的方法:

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: $0[0] as! Bool, animated: $0[1] as! Bool) }
}
}

我找到了一种方法。循环所有可见的cells并更改每个单元格的颜色,然后设置特定单元格的颜色。我想不是最漂亮的,但它确实有效:

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)

我使用以下方式,它对我有效。也许是好主意,也许是坏主意。如果您认为解决方案不好,请评论回答

var disposeBag = DisposeBag()
var selectedIndex = PublishSubject<Int>()

我们在这里收听点击事件。我们为单击的单元格更新selectedIndex。

self.myCollectionView.rx.itemSelected.subscribe(onNext: { indexPath in
self.selectedIndex.onNext(indexPath.row)           
}).disposed(by: self.disposeBag)

在这里,我们填充集合视图。我们根据选定的索引调整颜色。

Observable.of(myData)
.bind(to: self.myCollectionView.rx.items(
cellIdentifier: MyCollectionViewCell.cellIdentifier,
cellType: MyCollectionViewCell.self)) { index, data, cell in

self.selectedIndex.subscribe(onNext: { value in
if value == index {
cell.contentView.backgroundColor = .red
} else {
cell.contentView.backgroundColor = .blue
}
}).disposed(by: self.disposeBag)

}.disposed(by: self.disposeBag)

相关内容

  • 没有找到相关文章

最新更新