iT邦幫忙

2022 iThome 鐵人賽

DAY 4
0
自我挑戰組

iOS Junior的菜雞之路系列 第 4

架構不會,亂七八糟(MVVM下)

  • 分享至 

  • xImage
  •  

這邊要講的ViewController(即VC)的部分
在VC這邊會需要先進行binding,才能讓ViewModel更新完後的變更在VC進行

建立ViewModel變數

let viewModel: ExampleViewModel

初始化ViewModel變數

init(viewModel: ExampleViewModel) {
    self.viewModel = viewModel
    super.init(nibName: String(describing: ExampleViewController.self), bundle: nil)
}

required init?(coder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

binding


override func viewDidload() {
        super.viewDidLoad()
        // 一定要記得Binding,否則viewModel會改變不過來
        bindViewMoodel()
        // 只要不是畫面更新都會在ViewModel
        // download完後,ViewModel因為在VC有binding,所以下載完資料後,透過binding,可以直接通知到VC進行更新
        viewModel.intputs.downloadData()
}


private func bindViewModel() {
    var outputs = viewModel.outputs
    outputs.reloadData = {
         // VC更新UI,實際執行的部分
         // 舉例: tableView.reloadData() 這樣
    }
}

完整Code

class ExampleViewController {
    
    let viewModel: ExampleViewModel?
    
    init(viewModel: ExampleViewModel) {
        self.viewModel = viewModel
        super.init(nibName: String(describing: ExampleViewController.self), bundle: nil)
    }
    
    override func viewDidload() {
        super.viewDidLoad()
        // 一定要記得Binding,否則viewModel會改變不過來
        bindViewMoodel()
        
        // 實際使用: 只要不是畫面更新都會在ViewModel
        // download完後,ViewModel因為在VC有binding,所以下載完資料後,透過binding,可以直接通知到VC進行更新
        viewModel.intputs.downloadData()
    }
    
    private func bindViewModel() {
        var outputs = viewModel.outputs
        
        // download完後,更新的部分
        outputs.reloadData = {
            // 實際執行的部分,UI更新
            // 舉例: tableView.reloadData() 這樣
        }
    }
}

以上如果一步一步來的話,就可以完成MVVM架構


我踩的坑通常都是在趕進度的時候,有時候會不小心忘記沒有在ViewDidLoad的時候進行binding的function,然後發現沒變更一直查Bug,查到的時候通常都會臉色一黑,覺得自己怎麼這麼會搞自己。


上一篇
架構不會,亂七八遭(MVVM上)
下一篇
形形色色,模樣打底
系列文
iOS Junior的菜雞之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言