【问题标题】:View model binding in Swift在 Swift 中查看模型绑定
【发布时间】: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


【解决方案1】:

使用UITableViews 时,您可以为所有单元格保存一组视图模型/更新器,甚至是那些尚不可见的单元格。

根据填充单元格所需的数据,如果一次加载所有内容会损害性能或导致高内存使用率,您可能需要使用某种缓存机制,但这对于每种情况都是特定的。

一些代码来说明我的意思:

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
    }
}

【讨论】:

    猜你喜欢
    • 2012-08-27
    • 1970-01-01
    • 2017-04-17
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    • 2022-11-07
    • 2015-09-11
    相关资源
    最近更新 更多