【发布时间】:2016-12-28 00:49:12
【问题描述】:
我正在尝试使用协议在模型和视图之间进行双向绑定。 我通过创建 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 类中遵循这些协议
查看.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)
}
}
模型.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)
}
}
当我想将表格单元格绑定到模型时出现问题,因为我不知道哪个单元格绑定到数组中的哪个模型。有没有其他方法可以做到这一点?
【问题讨论】:
-
TableViewCells 遇到的问题是它们被“重用”。 TableView 控制器只创建足够的单元格来填充它的视图。当您滚动时,从顶部消失的单元格会在底部“重复使用”(有点像传送带)。由于它们的设计方式,将每个单元格绑定到特定的模型元素并不是很合适。
标签: ios swift model-view-controller data-binding model-binding