2017-08-11 404 views
0
// This button has different images with for selection and no selection which I configured in storyboard different images for two states. 

@IBOutlet weak var selectedRestarunt: UIButton! 
    // I am binding isSelected state like this which is working when user taps on button. 
    selectedRestarunt.rx.tap.scan(false) { lastState, _ in 
     return !lastState 
    } 

现在我有一个案例我手动标记isSelected没有水龙头。我该如何绑定UIButton.isSelectable与RXSwift

selectedRestarunt.isSelected = false/true 

这应该不会触发现有映射。 这应该以某种方式映射,以便我需要根据isSelected状态进行一些操作。 有人可以解释我怎么能做到这一点?

+0

我想你应该为'isSelected'属性编写自己的包装器。参见:https://github.com/ReactiveX/RxSwift/blob/master/RxCocoa/iOS/UIButton%2BRx.swift –

回答

0

采用可变此:

SelectedState.value将包含你的状态

let selectedState = Variable(true) 
_ = selectedState.asObservable().bindTo(selectedRestarunt.rx.isSelected) 
0

可以使用RxFeedback的建筑风格:

... 
let isSelected = PublishSubject<Bool>() 

enum Event { 
    case setIsSelected(Bool) 
    case toggle 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    Observable.merge(
     isSelected.map { Event.setIsSelected($0) }, 
     selectedRestarunt.rx.tap.map { _ in Event.toggle } 
    ).scan(false) { lastState, event in 
     switch event { 
     case .setIsSelected(let selected): 
      return selected 
     case .toggle: 
      return !lastState 
     } 
    }.bind(to: selectedRestarunt.rx.isSelected) 
    .disposed(by: disposeBag) 



    isSelected.onNext(true) // Mark isSelected manually without tap. 
} 
... 

使用Event枚举来形容状态更改,然后使用scan运算符应用更改。