Prepare segue传值时selectedName为nil问题求助
问题分析与解决方案
核心原因:Segue触发时序冲突
你大概率是在Storyboard里直接把按钮和第二个VC拖线创建了Segue,同时又在按钮的IBAction里调用了performSegue。这种情况下,点击按钮会先执行prepare(for:sender:),再执行IBAction里的赋值代码,导致prepare方法执行时selectedName还没被赋值,所以是nil。
解决方案1:统一Segue触发方式
- 打开Storyboard,删除按钮到第二个VC的Segue(右键Segue线,选择Delete)。
- 确保只保留代码中
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-
相关产品推荐
相关产品推荐

