0
在iOS項目中,我必須實現一個視圖控制器,該控制器允許使用滑塊和同時選擇一個浮點值。它應該具有以下行爲:使用ReactiveCocoa的循環綁定,如何將一個值綁定到兩個輸入UI元素
- 每當大量在文本字段中鍵入,滑塊應該更新它的價值的類型浮點數
- 每當滑塊拖動它應該與更新文本字段滑塊值
目前的想法如下:
我在視圖模型,實際值和值文本的兩種propertys。 每當更新值時,我都會更新視圖模型中的文本。 文本字段和滑塊都只更改該值。 但是,然後我有一種'循環'依賴:文本字段更新視圖模型值,它更新視圖模型文本,它綁定到我們只輸入值的文本字段。這會導致文本字段的錯誤行爲。我試圖解決isFirstResponder屬性,這種方法效果更好,但似乎並不是最佳實踐,加上它並不像預期的那樣。 有沒有辦法將slider的enabledProperty綁定到文本字段的isFirstResponder?這也將在VC工作
綁定:
layout.valueTextField.reactive.text <~ viewModel.valueText.map({ text in
if !self.layout.valueTextField.isFirstResponder {
return text
}
return self.layout.valueTextField.text ?? ""
}
)
viewModel.value <~ layout.valueSlider.reactive.values
layout.valueSlider.reactive.value <~ viewModel.value
viewModel.value <~ layout.valueTextField.reactive.continuousTextValues.map({ textValue in
if let t = textValue {
if let parsed = Float(t) {
return parsed
}
}
return viewModel.value.value
})
我的看法型號:
import ReactiveSwift
class ValuePickerViewModel {
var valueText: MutableProperty<String>
var value: MutableProperty<Float>
let minValue: Float
let maxValue: Float
let unit: String
init(initialValue: Float, formatter: FloatFormatter, minValue: Float, maxValue: Float, unit: String) {
self.value = MutableProperty(initialValue)
self.valueText = MutableProperty(formatter.format(value: initialValue))
self.valueText <~ self.value.map({value in
formatter.format(value: value)
}
)
self.minValue = minValue
self.maxValue = maxValue
self.unit = unit
}
}