0

尝试MVVM设计模式。

创建了一个tableViewinstoryboardFirstViewController添加了以下代码:

@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具有tableviewDelegatetableViewDatasource方法。

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两次后出现。

编辑:

MenuTableViewModel代码 :

class MenuTableViewModel: NSObject {

    var delegate:MenuTableViewModelDelegate!
}

FirstViewController - ViewDidLoad添加:

menuViewModel.delegate = self

感谢@koropok 的解决方案。添加了以下代码并且它有效:

DispatchQueue.main.async {
    self.delegate.present()
}

但为什么我必须这样做。

事实上,如果我添加以下代码:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    tableView.deselectRow(at: indexPath, animated: false)

    //DispatchQueue.main.async {

        self.delegate.present()
    //}
}

然后它也工作正常。

我的方法是错误的,或者我在这里遗漏了一些东西。

4

0 回答 0