尝试MVVM
设计模式。
创建了一个tableView
instoryboard
并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()
//}
}
然后它也工作正常。
我的方法是错误的,或者我在这里遗漏了一些东西。