4

我有一个 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,或者它可能来自其他地方。

我不明白如何将按钮按下的流与流结合起来,以editing允许这种方式没有无限循环,例如

Obervable.combineLatest(editButton.rx_tap.asObservable(), editing) { _, isEditing in
  editing.onNext(!isEditing)
}

我知道 tableView 有一个editing属性,但我不想依赖它,因为我正在寻找可以在其他地方重复使用的更通用的解决方案。我也不希望在实例 var 中跟踪 isEditing 的值,甚至不作为变量(),因为我正在寻找一个无状态的、基于流的解决方案(如果这是可能的话)。

谢谢!

4

2 回答 2

2

在 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

于 2016-02-15T04:57:45.753 回答
1

如果您定义editing为 aVariable而不是 a怎么办BehaviourSubject。AVariable不能出错,在这种情况下是有意义的。声明如下所示:

let editing = Variable(value: false)

您可以订阅一个按钮点击并将值更改为editing否定的当前值:

editButton.rx_tap.asObservable().subscribeNext { editing.value = !editing.value }

随着改变这个方法的value属性editing被调用

editing.subscribeNext { isEditing in
    tableView.setEditing(isEditing, animated: true)
}

所有这些都没有经过测试,但可能会引导您朝着正确的方向寻求正确的解决方案。

于 2016-02-11T10:21:32.523 回答