Пытаясь MVVM
дизайн шаблона.
Создано tableView
в storyboard
и FirstViewController
, добавлено ниже кода:
@IBOutlet weak var menuTblView: UITableView!
let menuViewModel = MenuTableViewModel()
override func viewDidLoad() {
super.viewDidLoad()
self.menuTblView.dataSource = menuViewModel
self.menuTblView.delegate = menuViewModel
menuViewModel.delegate = self
menuTblView.register(UINib.init(nibName: "MenuTableViewCell", bundle: nil), forCellReuseIdentifier: "MenuTableViewCell")
menuTblView.separatorStyle = .none
}
и создал MenuTableViewModel
с методами tableviewDelegate
и tableViewDatasource
.
В MenuTableViewModel
добавлено didSelectRowAt
:
extension MenuTableViewModel:UITableViewDelegate{
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
delegate.present()
}
}
protocol MenuTableViewModelDelegate : class {
func present()
}
и создал prototcol
для представления SecondViewController
.
В FirstViewController
добавлен код:
extension FirstViewController : MenuTableViewModelDelegate {
func present() {
let asd = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SecondViewController") as! SecondViewController
self.present(asd, animated: true, completion: nil)
}
}
Проблема в том, что SecondViewController
появляется после двойного нажатия tableViewCell
.
EDIT:
MenuTableViewModel
код:
class MenuTableViewModel: NSObject {
var delegate:MenuTableViewModelDelegate!
}
и в FirstViewController - ViewDidLoad
добавлено:
menuViewModel.delegate = self
Спасибо @koropok за решение. Добавил код ниже и все заработало:
DispatchQueue.main.async {
self.delegate.present()
}
но почему я должен это делать.
Infact Если я добавляю ниже код:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: false)
//DispatchQueue.main.async {
self.delegate.present()
//}
}
тогда тоже нормально работает.
Мой подход неверный, или я что-то здесь упускаю.