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

Swift中通过Segue传递字符串变量失败,求排查错误原因

问题分析与解决方案

嘿,我一眼就发现问题所在啦!你的核心错误是把prepare(for:sender:)方法嵌套在了if条件判断的代码块内部,这完全不符合UIKit的调用逻辑😯

错误原因详解

prepare(for:sender:)是UIViewController的标准生命周期回调方法,系统在触发Segue跳转时,会自动调用类顶层作用域下的这个方法。而你把它写在if control == view.rightCalloutAccessoryView的代码块里,系统根本找不到这个方法,自然也就不会执行给DetailViewController的Name变量赋值的操作。


修正后的代码

FirstViewController 代码

// 把prepare方法移到类的顶层作用域,和其他类方法同级
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    // 用guard做安全类型转换,避免强制解包崩溃
    guard let detailVC = segue.destination as? DetailViewController else {
        return
    }
    // 加上Segue标识符判断,适配多个Segue的场景
    if segue.identifier == "showdetail" {
        detailVC.Name = "test"
    }
}

// 按钮触发Segue的逻辑单独放在条件判断里
if control == view.rightCalloutAccessoryView {
    performSegue(withIdentifier: "showdetail", sender: self)
}

DetailViewController 代码(可以小优化下命名)

class DetailViewController: UIViewController, WKNavigationDelegate {
    // 遵循Swift命名规范,变量名用小驼峰
    var name: String = ""
    override func viewDidLoad() {
        super.viewDidLoad()
        print(name)
    }
}

额外优化建议

  • 命名规范:Swift中变量建议用小驼峰(如name),类名用大驼峰,这样代码更符合行业共识。
  • 安全解包:避免使用as!强制类型转换,改用guard let或if let,防止Segue目标控制器类型不匹配时崩溃。
  • 标识符校验:确保Storyboard中Segue的标识符和代码里的"showdetail"完全一致(大小写、拼写都不能错)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:30:35