iOS MVVM 一分钟教程(无RAC, Swift版)

这是MVVM基础用法,
相比MVP, 最大的不同点在于, MVVM要负责对V的更新

Model

// Person.swift
struct Person {
    let firstName: String
    let lastName: String
}

ViewModel

// GreetinViewModel.swift

protocol GreetingViewModelProtocol {
    var greeting: String? {get}
    var greetingDidChange:((GreetingViewModelProtocol)->())? { get set }
    init(person: Person)
    func showGreeting()
}

class GreetingViewModel : GreetingViewModelProtocol {
    let person: Person
    
    required init(person: Person) {
        self.person = person
    }

    var greeting: String? {
        didSet {
            // VM的值被更新后, 再去更新V
            self.greetingDidChange!(self)
        }
    }

    var greetingDidChange: ((GreetingViewModelProtocol) -> ())?
    
    func showGreeting() {
        self.greeting = "Hello  \(person.firstName) \(person.lastName)"
    }

}

View

// ViewController.swift


import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var lbTitle: UILabel!
    
    var person:Person? = nil
    
    var viewModel:GreetingViewModelProtocol! {
        didSet {
            // 负责VM更新V
            self.viewModel.greetingDidChange = { vm in
                self.lbTitle.text = vm.greeting
            }
        }
    }
    
    @IBAction func onClick(_ sender: Any) {
        // V更新VM
        self.viewModel.showGreeting()
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        person = Person(firstName: "Gao", lastName: "L")
        self.viewModel = GreetingViewModel(person: person!)
    }

}

工程代码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容