TableView单元格选择无法正常工作

时间:2018-07-04 06:06:26

标签: ios swift uitableview mvvm

尝试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
} 

并创建具有MenuTableViewModeltableviewDelegate方法的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

编辑:

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()
    //}
}

然后它也能正常工作。

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

0 个答案:

没有答案