У вас есть пара вариантов, но я расскажу о решении с делегатом.
Идея состоит в том, чтобы определить protocol
и свойство этого протокола в MyViewModel
и сделать MyViewController
соответствующим ему.
Вот как может выглядеть MyViewModel
:
protocol MyViewModelDelegate: class {
func didTapOnCell()
}
class MyViewModel {
// Please note the delegate is weak and optional
weak var delegate: MyViewModelDelegate?
// This function handle gesture recognizer taps
@objc func handleImageViewTap() {
delegate?.didTapOnCell()
}
// Here is the rest of the ViewModel class...
}
Затем в MyViewController
вы устанавливаете свойство делегата viewModel на self
и соответствует функции протокола (я предполагаю,контроллер представления ссылается на экземпляр модели представления).
class MyViewController: UITableViewController {
func setup() {
// ...
// When MyViewModel is initialised, set the delegate property to self
myViewModel.delegate = self
}
}
extension MyViewController: ViewModelDelegate {
func didTapOnCell() {
// ...
// Allocate instance of anotherViewController here and present it
self.present(anotherViewController, animated: true, completion: .none)
}
}
Таким образом, вы можете сообщить MyViewController
что-то произошло в MyViewModel
и действовать соответственно.
Обратите внимание, что необходимо сделать свойство delegate
необязательным, чтобы избежать сохранения циклов.