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

Prepare segue传值时selectedName为nil问题求助

问题分析与解决方案

核心原因:Segue触发时序冲突

你大概率是在Storyboard里直接把按钮和第二个VC拖线创建了Segue,同时又在按钮的IBAction里调用了performSegue。这种情况下,点击按钮会先执行prepare(for:sender:),再执行IBAction里的赋值代码,导致prepare方法执行时selectedName还没被赋值,所以是nil。

解决方案1:统一Segue触发方式

  1. 打开Storyboard,删除按钮到第二个VC的Segue(右键Segue线,选择Delete)。
  2. 确保只保留代码中IBAction里的performSegue(withIdentifier: "segue", sender: self)触发逻辑。

解决方案2:优化传值逻辑(更可靠)

不用依赖类属性selectedName,直接把要传递的值作为sender传给Segue,彻底避免时序问题:

@IBAction func touch(_ sender: UIButton) {
    // 优化获取cell的方式,避免依赖固定视图层级
    var currentView = sender as UIView
    while let superView = currentView.superview {
        if let cell = superView as? UITableViewCell {
            currentView = cell
            break
        }
        currentView = superView
    }
    guard let cell = currentView as? UITableViewCell,
          let indexPath = table.indexPath(for: cell),
          let name = table.cellForRow(at: indexPath)?.textLabel?.text else {
        return
    }
    // 直接把要传递的名字作为sender传入
    performSegue(withIdentifier: "segue", sender: name)
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    guard segue.identifier == "segue",
          let vc2 = segue.destination as? Second_VC,
          let name = sender as? String else {
        return
    }
    vc2.name = name
}

额外注意点

  • 如果继续使用原方式传值,要确保selectedName是First_VC的类属性,比如在类顶部声明:var selectedName: String?,不要在IBAction里声明为局部变量。
  • 不要用sender.superview!.superview这种强转方式获取cell,iOS不同版本或自定义cell的视图层级可能变化,容易崩溃或获取失败,用循环遍历父视图的方式更稳定。

内容的提问来源于stack exchange,提问作者Resurrect1on-

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 01:07:19