我有一个 UITableView,如果满足某些条件,我想将其置于编辑状态。切换编辑的主要方式是通过编辑按钮。
所以我的 View 元素是
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
是触发编辑模式打开或关闭的主要方式,我将通过 tableView.rx_itemSelected
发送的事件作为附加输入示例(在本例中,我希望编辑在任何时候选择一个项目时结束)。
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)
}
注意:每次选择一个项目时,此解决方案都会将 .Next(false)
发送到 isEditing
,即使表格当前未处于编辑模式。如果您觉得这是一件坏事,并且想要过滤 rx_itemSelected
以仅在表格实际处于编辑模式时发送 .Next(false)
,您可以这样做使用 withLatestFrom
和 filter
的组合。
关于swift - 如何在不创建无限循环的情况下让 RxSwift 中的主题将值推送给自身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35329892/