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
相关产品推荐
相关产品推荐

