让我解释一下我的问题;
这些对象存储在事件数组中
var events: [Event]
此外,我还有另一个视图控制器(DetailViewContoller),在该视图控制器中,我有一个变量用于从tableview接收事件对象。
import UIKit
class EventDetailViewController: UIViewController {
var event: Event?
override func viewDidLoad() {
super.viewDidLoad()
print(event?.name)
}
当我点击单元格时,我想将当前事件对象传递给DetailViewController中的变量(在上面指示)。所以我尝试了->
extension EventListViewcontroller:UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
// Whenever cells tapped, related object needs to pass DetailViewController
performSegue(withIdentifier: K.Segues.eventListToDetail, sender: self)
func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == K.Segues.eventListToDetail {
let VC = segue.destination as! EventDetailViewController
VC.event = events[indexPath.row]
}
}
}
但是不幸的是,当我在DetailViewController中检查了事件变量时执行了segue之后,它显示为nil。所以问题是,如何将我的窃听事件单元传递给其他视图控制器?
注意:我已经找到了这个主题How do you test UIStoryBoard segue is triggered by didSelectRow(at:),但它对我的问题没有帮助...
将prepareForSegue
移出didSelectRowAt
您仍可以使用IndexPath
的indexPathForSelectedRow
属性获得当前选择的UITableView
func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == K.Segues.eventListToDetail {
if let vc = segue.destination as? EventDetailViewController,
let indexPath = tableView.indexPathForSelectedRow {
vc.event = events[indexPath.row]
}
}
}