【问题标题】:Swift Bond 5 migrating from 4 bidirectionalSwift Bond 5 从 4 双向迁移
【发布时间】:2016-09-23 04:28:11
【问题描述】:

我正在尝试在我的一个项目中切换到 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'

所以信号不再可绑定。有人知道如何转换这段代码以使双向绑定仍然有效吗?

【问题讨论】:

    标签: data-binding swift3 reactivekit


    【解决方案1】:

    与转换后的信号/可观察对象的双向绑定实际上没有意义,因为它需要逆变换才能将事件传播回去。

    您可能想要建立以下绑定,而不是双向绑定:

    radius.bind(to: radiusSlider)
    sliderStepObserver.bind(to: radius)
    

    此外,您需要删除 distinct 运算符,否则步进将无法正常工作。它不起作用的原因是用户永远不会停止触摸屏幕,所以我们也必须永远不要停止将滑块位置更新为步进值。

    【讨论】:

    • 非常感谢您的意见。是的,这似乎没有任何意义。在这种情况下,唯一的想法是用滑块发出的信号更新radius observable。根本不需要其他方向。我不知道为什么原始开发人员这样做是正确的。还是谢谢!
    猜你喜欢
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多