DataBinding with Swift KeyPath https://github.com/tonnylitao/KPDataBinding
struct User {
var name: String?
}
let binding = KPDataBinding<User>()
binding.bind(
\.name => uiLabel
)
binding.update(\.name, with: "Tonny")
//binding.model.name == "Tonny"
//uiLabel.text == "Tonny"
struct User {
var age: Int
}
binding.oneWayBind(\.age, ageLabel) { view, value, _ in
view.text = "Your Age: \(value)"
}
binding.update(\.age, with: 10)
//binding.model.age == 10
//ageLabel.text == "Your Age: 10"
struct User {
var aString: String?
var isOn: Bool
var isSelected: Bool
var isSelected: Bool
var aFloat: Float
var aDouble: Double
}
binding.bind([
\.aString <=> uiTextField,
\.isOn <=> uiSwitcher,
\.isSelected <=> uiButton,
\.aFloat <=> uiSlider,
\.aDouble <=> uiSteper,
])
//view value and model value will be equal
//binding.model.isOn == uiSwitcher.isOn
//binding.model.isSelected == uiButton.isSelected
//binding.model.aFloat == uiSlider.value
//binding.model.aDouble == uiSteper.value
Note: This text of UITextField is @"" by default. https://developer.apple.com/documentation/uikit/uitextfield/1619635-text
binding.update(\.aString, with: nil)
//userViewModel.model.aString == nil
//uiTextField.text == ""
binding.update(\.aString, with: "A new String")
//binding.model.aString == "A new String"
//uiTextField.text == "A new String"
binding.twoWayBind(\.age, ageSteper,
updateView: { view, value, _ in
view.value = Double(value)
},
updateModel: { model, view in
model.age = Int(view.value)
}
)
//when ageSteper's value changed to 3.0
//binding.model.age == 3
//when age changed to 4
//uiSteper.value == 4.0
Always update model through ViewModel, and the binding view will be updated automatically.
binding.update(\User.name, with: "A new Name")
binding.unbind(\User.name)
model[keyPath: \User.name] = "Tonny" //update model
view[keyPath: \UITextField.text] = "Tonny" //update view
view[keyPath: \UITextField.text] = model[keyPath: \User.name] //update view from model
view.addTarget(self, #selector(viewChanged), for: event)
func viewChanged(view: UITextField) {
model[keyPath: \User.name] = view[keyPath: \UITextField.text] //update model from view
}
link |
Stars: 0 |
Last commit: 3 years ago |
Swiftpack is being maintained by Petr Pavlik | @ptrpavlik | @swiftpackco | API | Analytics