You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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的直接绑定,改为手动触发:

  1. 在Storyboard中,给你的Segue设置一个唯一的Identifier(比如ShowSubjectDetail)
  2. 删除Cell上的Segue关联
  3. 修改代码如下:
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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:23:28