尝试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
。
编辑:
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()
//}
}
然后它也能正常工作。
我的方法是错误的,或者我在这里遗漏了一些东西。