使用prepareForSegue在TableView间传递index失效问题求助
问题根源:Segue触发顺序导致的延迟更新
你遇到的"慢一步"问题,核心原因是Storyboard中直接给UITableViewCell绑定Segue时,系统的方法调用顺序不符合你的预期:
当你点击Cell时,系统会先执行prepare(for:sender:),再执行tableView(_:didSelectRowAt:)。这就导致第一次点击时,你在didSelectRowAt里给index赋值的操作还没执行,prepare(for:sender:)就已经把初始值0传递给了详情VC,所以加载的还是解剖学信息;返回后,index已经被上一次的didSelectRowAt更新为目标值,此时再次点击,prepare(for:sender:)才会传递正确的数值。
两种解决方案
方案1:直接在prepare(for:sender:)中获取选中行(推荐)
完全不需要额外的index属性,直接在准备Segue时获取当前选中的indexPath,彻底避免顺序问题:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if let subjectDetailTableViewController = segue.destination as? SubjectDetailsTableViewController { // 直接获取当前选中的行,无需依赖didSelectRowAt的赋值 if let selectedIndexPath = tableView.indexPathForSelectedRow { subjectDetailTableViewController.index = selectedIndexPath.row } } }
同时你可以删除原来的var index = 0属性和didSelectRowAt里的赋值代码(如果不需要打印日志的话)。
方案2:手动触发Segue
如果一定要保留didSelectRowAt里的逻辑,可以取消Storyboard中Cell和Segue的直接绑定,改为手动触发:
- 在Storyboard中,给你的Segue设置一个唯一的Identifier(比如
ShowSubjectDetail) - 删除Cell上的Segue关联
- 修改代码如下:
var index = 0 override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { index = indexPath.row print("Button tapped\(index)") // 手动触发Segue performSegue(withIdentifier: "ShowSubjectDetail", sender: self) } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if let subjectDetailTableViewController = segue.destination as? SubjectDetailsTableViewController { subjectDetailTableViewController.index = index } }
这样方法的调用顺序就变成了:didSelectRowAt(更新index)→ performSegue → prepare(for:sender:)(传递最新的index),完全符合你的预期。
内容的提问来源于stack exchange,提问作者Jared L.
相关产品推荐
相关产品推荐

