[英]View model binding in Swift
我试图使用协议在模型和视图之间进行双向绑定。 我通过创建3个协议来完成它:BoundableView.swift
protocol BoundableView {
var updater: ViewModelUpdater? {get set}
}
BoundableModel.swift
protocol BoundableModel {
var updater: ViewModelUpdater? {get set}
}
ViewModelUpdater.swift
protocol ViewModelUpdater {
func updateModel(view: BoundableView)
func updateView(model: BoundableModel)
}
然后在MVC类中使用这些协议
View.swift
class View: UIView,BoundableView {
var updater :ViewModelUpdater? = nil
@IBOutlet var nameTextField: UITextField!
@IBOutlet var valueTextField: UITextField!
@IBAction func valueChanged(_ sender: AnyObject) {
updater?.updateModel(view: self)
}
}
Model.swift
class Model : BoundableModel{
var updater: ViewModelUpdater? = nil
var name:String {
didSet {
if let updater = updater{
updater.updateView(model: self)
print(self)
}
}
}
var value:Int {
didSet {
if let updater = updater{
updater.updateView(model: self)
print(self)
}
}
}
init(name:String,value:Int) {
self.name = name
self.value = value
}
}
Controller.swift
class Controller: UIViewController,ViewModelUpdater {
var boundableModel = Model(name : "hello", value: 5)
@IBOutlet var boundableView: View!
override func viewDidLoad() {
super.viewDidLoad()
boundableModel.updater = self
boundableView.updater = self
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func updateModel(view: BoundableView) {
let view = view as! View
boundableModel.name = view.nameTextField.text!
boundableModel.value = Int(view.valueTextField.text!)!
}
func updateView(model: BoundableModel) {
let model = model as! Model
boundableView.nameTextField.text = model.name
boundableView.valueTextField.text = String(model.value)
}
}
当我想将表格单元格绑定到模型时出现问题,因为我不知道哪个单元格绑定到数组中的哪个模型。 有没有其他方法可以做到这一点?
使用UITableViews
您可以为所有单元格保存一组viewModel / updaters,甚至是那些尚未显示的单元格。
根据您填充单元所需的数据,如果一次加载一切会损害性能或导致高内存使用,可能需要使用某种缓存机制,但这是针对每种情况的。
一些代码显示我的意思:
class MyBindableCell: UITableViewCell, BoundableView {
var updater: ViewModelUpdater? = nil
//...
}
class Controller: UIViewController {
var cellViewModels: [BoundableModel]
var cellViewModelUpdaters: [ViewModelUpdater]
override func viewDidLoad() {
super.viewDidLoad()
//...
//initialize cellViewModels and viewModelUpdaters
//...
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cellId", forIndexPath: indexPath) as! MyBindableCell
cell.updater = viewModelUpdaters[indexPath.row]
cell.updater?.updateView(cellViewModels[indexPath.row])
return cell
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.