我有一个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/

10-10 11:41