我有一个UITableView,如果满足某些条件,我想将其置于编辑状态。切换编辑的主要方法是通过编辑按钮。
所以我的视图元素是
let tableView = UITableView()
let editButton = UIButton()
以及TableView是否应处于编辑模式,来自:
let editing = BehaviorSubject(value: false)
它将通过如下方式连接到TableView:
editing.subscribeNext { isEditing in
tableView.setEditing(isEditing, animated: true)
}
点击编辑按钮时,我希望将新值推到
editing
,这是发送到editing
的最新值的负值。最近的值可能是通过点击来设置的,或者它可能来自其他地方。我不知道如何将按钮按下的流与
editButton
的流结合起来,这样就可以在没有无限循环的情况下实现这一点,例如。Obervable.combineLatest(editButton.rx_tap.asObservable(), editing) { _, isEditing in
editing.onNext(!isEditing)
}
我知道TableView有一个
editing
属性,但我不想依赖它,因为我正在寻找一个更通用的解决方案,我可以在其他地方重复使用。我也不想跟踪实例var中的isediting值,甚至作为variable(),因为我在寻找一个无状态的、基于流的解决方案(如果可能的话)。谢谢您!
最佳答案
在RXSwift Github问题论坛的帮助下,我现在已经解决了:)。关键是。我在下面举了一个例子,以防它能帮助其他人。withLatestFrom
是启动或关闭编辑模式的主要方法,我已经将通过editButton
发送的事件作为附加输入示例(在本例中,我希望在选择某个项目时结束编辑)。
let isEditing = BehaviorSubject(value: false)
let tableView = UITableView()
let editButton = UIButton()
tableView.rx_itemSelected
.map { _ in false }
.bindTo(isEditing)
editButton.rx_tap.withLatestFrom(isEditing)
.map { !$0 }
.bindTo(isEditing)
isEditing.subscribeNext { editing in
tableView.setEditing(editing, animated: true)
}
注意:此解决方案在每次选择项目时都会将
tableView.rx_itemSelected
发送到.Next(false)
,即使该表当前未处于编辑模式。如果您认为这是一件坏事,并且希望筛选isEditing
以仅发送rx_itemSelected
,如果表实际上处于编辑模式,则可以使用.Next(false)
和withLatestFrom
的组合来执行此操作。关于swift - 如何让RxSwift中的主题将值推送到自身而不创建无限循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35329892/