我试图让用户点击单元格时切换到另一个视图控制器。目前,我是通过将故事板中的控件拖到我的视图控制器中,然后将以下代码传递给prepare(for segue...)
来设置单元格的。基本上,我的警卫声明确认我具有正确的视图控制器,然后在它们之间传递一个对象。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
super.prepare(for: segue, sender: sender)
switch(segue.identifier ?? "") {
case "ShowEventDetailsSegue":
guard let navVC = segue.destination as? UINavigationController else {
fatalError("Unexpected destination: \(segue.destination)")
}
guard let EventDetailViewController = navVC.viewControllers.first as? EventViewController else {
fatalError("Unexpected navigation view controller: \(String(describing: navVC.viewControllers.first))")
}
guard let selectedEventCell = sender as? EventTableViewCell else {
fatalError("Unexpected sender: \(String(describing: sender))")
}
guard let indexPath = tableView.indexPath(for: selectedEventCell) else {
fatalError("The selected cell is not being displayed by the table")
}
let selectedEvent = events[indexPath.section]
EventDetailViewController.event = selectedEvent
default:
fatalError("Unexpected Segue Identifier; \(String(describing: segue.identifier))")
}
}
我知道其他人建议拨打
之类的电话DispatchQueue.main.async {
self.present(myVC, animated: true, completion: nil)
}
但是,当我这样做时,我收到一条错误消息“由于未捕获的异常'NSInvalidArgumentException',正在终止应用程序,原因:'应用程序试图以模态方式显示活动的控制器”。
基本上,我希望用户只能单击一次单元格,仍然能够将数据传递给另一个视图控制器。
还奇怪的是,这才刚刚开始发生。今天以前我没有这个问题。
答案 0 :(得分:0)
所以您正在做的是:
在tableView
didSelectRowAt
方法中,您要添加:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
self.performSegue(withIdentifier: "ShowEventDetailsSegue", sender: nil)
}
触发delegate
方法:
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
已经有一个控制器准备打开,而您正在以编程方式呈现另一个控制器,这显然会引发错误。
您可以编写另一种逻辑来tableView
didSelectRowAt
中以编程方式呈现视图,也可以在第二个视图控制器viewDidLoad
方法中移动整个代码。
答案 1 :(得分:0)
结果是,我的单元格的选择样式设置为“无”。
cell.selectionStyle = UITableViewCellSelectionStyle.none
虽然我不想要选择样式,所以解决方法是进行异步调用
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
DispatchQueue.main.async {
self.performSegue(withIdentifier: "ShowEventDetailsSegue", sender: nil)
}
}
现在可以解决此问题。有关更多信息,请查看this post.