Обычно, в MVVM вся логика, связанная с пользовательским интерфейсом, должна быть написана в ViewModel, View или ViewController должны отображать только пользовательский интерфейс в соответствии с ViewModel и отправлять событие пользовательского интерфейса в ViewModel. когда ViewModel изменяется, он отправляет событие или уведомление, поэтому View может ответить и измениться. это называется связыванием. Точно так же viewModel должен связываться и с Model.
В вашем случае, ViewModel должен иметь метод удаления, например,
func delete(atIndex indexPath: IndexPath) {
// model should declare modify method and viewModel should call it and observe changes too. here directly modify it for simplicity
// you may also need to check input parameter is valid
// now input is valid, do the change
datasourceModel.dataListArray!.remove(at: indexPath.row)
// and then fire a notification
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "DeleteAtRow"), object: self, userInfo: ["indexPath" : indexPath])
}
чтобы представление могло передать ему событие
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
// pass delete cell event to viewModel
chartViewModel.delete(atIndex: indexPath)
}
}
просмотр также необходимо связать изменения
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
NotificationCenter.default.addObserver(self, selector: #selector(viewModelDeleteRows(n:)), name: NSNotification.Name(rawValue: "DeleteAtRow"), object: chartViewModel)
}
@objc func viewModelDeleteRows(n: NSNotification) {
if let i = n.userInfo?["indexPath"] as? IndexPath {
// respond to viewModel changes and sync UI
self.tableView.deleteRows(at: [i], with: .automatic)
}
}
Кроме того, вы можете передать событие удаления ячейки его контроллеру, затем контроллер может перейти к viewModel
var deleteCell : ((ChartCell) -> Void)?
@IBAction func clickDeleteButton(sender: UIButton) {
deleteCell?(self)
}
и настройте ячейку
cell.deleteCell = {[weak self] in
if let i = self?.tableView.indexPath(for: $0) {
self?.chartViewModel.delete(atIndex: i)
}
}