在 RX Swift iOS 中设置绑定时转换属性值



我在iOS的视图模型中定义了一个视图模型属性,如下所示。

var isIndividualActivity = BehaviorRelay<Bool>(value: false)

在视图控制器中,我想根据上述属性设置下面的绑定。

  1. 当视图模型中isIndividualActivity属性设置为 true 时,隐藏团队UIView并显示单个UIView。当isIndividualActivity设置为 false 时,隐藏单个UIView并显示团队UIView。我想通过绑定如下所示的内容来实现这一点。
viewModel.isIndividualActivity
.bind(to: individualView.rx.isHidden)
.disposed(by: self.disposeBag)
viewModel.isIndividualActivity
.bind(to: teamView.rx.isHidden)
.disposed(by: self.disposeBag)

如何在绑定到这两个UIView时使用相同的属性并反转布尔绑定?

  1. 我还希望使用相同的属性来设置UIView的顶部约束,如下所示。我正在寻找在设置绑定时将布尔数据转换为CGFloat数字的选项。我怎样才能做到这一点?

    viewModel.isIndividualActivity
    .bind(to: pointViewTopConstraint.rx.constant)
    .disposed(by: self.disposeBag)
    

PS:我知道我可以在isIndividualActivity上使用订阅功能并进行真/假检查并设置视图的可见性和顶部约束。但是,我想知道是否有办法实现使用反向布尔绑定并在绑定时将布尔值转换为值。

你应该使用 map:

viewModel.isIndividualActivity
.map(!)
.bind(to: individualView.rx.isHidden)
.disposed(by: self.disposeBag)
viewModel.isIndividualActivity
.map { isActivity -> CGFloat in
isActivity ? 40 : 0 //example values
}
.bind(to: pointViewTopConstraint.rx.constant)
.disposed(by: self.disposeBag)

最新更新