Cha*_*tte 5 binding swift rx-swift
我创建了一个通用变量。例如,该变量可以连接到文本字段或其他界面元素(例如开关)。所以我的变量的类型将是 Any,这样我就可以存储布尔值、字符串或其他内容。
var test: BehaviorRelay<Any?> = BehaviorRelay<Any?>(value: nil)
Run Code Online (Sandbox Code Playgroud)
然后我尝试将界面元素连接到该变量
(self.switch.rx.value <-> viewModel.test).disposed(by: self.disposeBag)
Run Code Online (Sandbox Code Playgroud)
或者
(self.textfield.rx.text <-> viewModel.test).disposed(by: self.disposeBag)
Run Code Online (Sandbox Code Playgroud)
出现此错误Cannot convert value of type 'BehaviorRelay<Any?>' to expected argument type 'BehaviorRelay<Bool>'或Cannot convert value of type 'BehaviorRelay<Any?>' to expected argument type 'BehaviorRelay<String?>'
我怎样才能用 RxSwift 做到这一点?
你可以在这里找到我的 <-> 函数:
infix operator <->
func <-> <T>(property: ControlProperty<T>, variable: BehaviorRelay<T>) -> Disposable {
let bindToUIDisposable = variable.asObservable()
.bind(to: property)
let bindToVariable = property
.subscribe(onNext: { n in
variable.accept(n)
}, onCompleted: {
bindToUIDisposable.dispose()
})
return Disposables.create(bindToUIDisposable, bindToVariable)
}
Run Code Online (Sandbox Code Playgroud)
(在这种情况下,双向绑定不会导致无限循环,因为 UI 元素在以编程方式修改时不会发出值,它们仅在用户更改值时才会发出值。如果用户翻转开关,它就会被推送到然后,Subject [BehaviorRelay] 将值推回到开关,但到此结束。)
您必须将您的元素投射到Any?with 地图并映射 Any? 从BehaviorRelay 转到UI 元素时返回到正确的类型。这样做非常笨拙且不安全。
更好的方法是使您的BehaviorRelay 元素具有正确的类型。无论如何,您必须了解该类型才能对其进行任何有用的操作。
| 归档时间: |
|
| 查看次数: |
5586 次 |
| 最近记录: |