Выбор ячейки TableView не работает должным образом - PullRequest
0 голосов
/ 04 июля 2018

Пытаясь 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()
    //}
}

тогда тоже нормально работает.

Мой подход неверный, или я что-то здесь упускаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...