我试图在我的一个项目中切换到Swift Bond 5和Swift 3。 我有两个方向绑定的问题。如何转换下面的代码,以便在我的滑块更改时,它会逐步发出不同的信号并将其值设置为半径可观察值。在旧的Bond 4和Swift 2.3中,一切正常,但我不知道如何处理这种迁移。
let radiusSlider: UISlider = /* slider initialisation */
let radius = Observable<Float>(10.0)
let stepValue:Float = 50.0
let sliderStepObserver = radiusSlider.bnd_value.map { roundf($0/stepValue)*stepValue }.distinct()
radiusSlider.value = radius.value
radius.bidirectionalBind(to: sliderStepObserver) /* here is the problem */
错误消息是:
Argument type 'Signal<Float, DynamicSubject.Error>' (aka 'Signal<Float, NoError>') does not conform to expected type 'BindableProtocol'
因此信号不再可绑定。有人有任何想法如何转换这段代码,以便双向绑定仍然有效吗?
答案 0 :(得分:1)
对转换后的信号/可观察对象的双向绑定实际上没有意义,因为它需要逆变换来传播事件。
您可能希望建立以下绑定,而不是双向绑定:
radius.bind(to: radiusSlider)
sliderStepObserver.bind(to: radius)
此外,您需要删除该distinct
运算符,否则步进将无法正常工作。它不起作用的原因是用户永远不会停止触摸屏幕,因此我们也必须永远不要停止将滑块位置更新为步进值。