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 
} 

} 

回答

1

解決方法很簡單: 的文本框的值綁定到視圖模型浮點值。 幻燈片值綁定到視圖模型文本值。 所以每個組件都更新其他組件,並且沒有循環!

工作代碼:

綁定:

viewModel.value <~ layout.valueTextField.reactive.continuousTextValues.map({ textValue in 
     if let t = textValue { 
      if let parsed = Float(t) { 
       return parsed 
      } 
     } 
    return viewModel.value.value 
    }) 
    viewModel.valueText <~ layout.valueSlider.reactive.values.map({ value in 
     return viewModel.formatter.format(value: value) 
    }) 
    layout.valueSlider.reactive.value <~ viewModel.value 
    layout.valueTextField.reactive.text <~ viewModel.valueText 

視圖模型:

import ReactiveSwift 

class ValuePickerViewModel { 

var valueText: MutableProperty<String> 
var value: MutableProperty<Float> 
let minValue: Float 
let maxValue: Float 
let unit: String 
let formatter: FloatFormatter 

init(initialValue: Float, formatter: FloatFormatter, minValue: Float, maxValue: Float, unit: String) { 
    self.formatter = formatter 
    self.value = MutableProperty(initialValue) 
    self.valueText = MutableProperty(formatter.format(value: initialValue)) 
    self.minValue = minValue 
    self.maxValue = maxValue 
    self.unit = unit 
} 

} 
相關問題