2016-02-11 33 views
4

我有一個UITableView,如果滿足某些條件,我想將其置於編輯狀態。切換編輯的主要方式是通過編輯按鈕。如何在RxSwift中將主題推送到自身而不創建無限循環

所以視圖元素我是

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的值,甚至無法追蹤Variable(),因爲我在尋找無狀態,基於流的解決方案(如果這是可能的話)。

謝謝!

回答

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)(如果表格實際處於編輯模式),則可以使用withLatestFromfilter的組合來執行此操作。

+0

感謝分享,非常有幫助! – Rogare

1

如果將editing定義爲Variable而不是BehaviourSubject會怎麼樣?在這種情況下,Variable不會出錯,這是有道理的。該聲明是這樣的:

let editing = Variable(value: false) 

您可以訂閱一個按鈕,水龍頭和改變editing到否定當前值:

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

隨着改變editingvalue財產這種方法稱爲

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

所有這些都沒有經過測試,但可能導致您在正確的方向爲正確的解決方案。

+0

爲建議歡呼!這絕對有可能使用Variable,但是一旦你使用了Variable,你並沒有真正結合流來實現這一點。相反,您正在介紹狀態並使用它(與我在跟蹤實例var中的isEditing時非常相似)。正如我所說我正在尋找基於流的解決方案。我會編輯我的問題,使其更清晰一點! – Jai