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

全局变量在函数间丢失值:iOS Segue跳转问题求助

解决iOS Segue中变量值丢失的问题

嘿,刚看了你的代码,我大概知道问题出在哪了——咱们一步步来捋清楚:

核心问题分析

你遇到的变量值丢失,大概率是下面两个原因之一:

  1. 全局变量的生命周期不可控:你用了全局的mainAppointment,如果在performSegue执行前,这个变量被其他代码意外重新初始化(比如别的地方又写了mainAppointment = Appt()),就会覆盖你在IBAction里设置的值。
  2. Segue的关联方式错误:如果你的segue是直接从SubMenuOneViewController拖到目标导航控制器的,而不是从按钮拖过去的,那么系统会先执行prepare(for:sender:),再执行IBAction里的代码,这时候变量还没被设置,自然只能拿到默认值。

解决方案

方案1:放弃全局变量,通过Segue的sender传递数据(推荐)

全局变量在iOS开发中尽量少用,不仅容易出问题,也不符合MVC的设计思路。我们可以把需要传递的数据直接通过performSegue的sender参数传递:

import UIKit

class SubMenuOneViewController: UIViewController {
    // 把变量移到控制器内部作为私有属性,避免全局污染
    private var selectedAppointment = Appt()

    @IBAction func selectAppointmentSetting(_ sender: myFirstButton) {
        // 设置需要传递的数据
        selectedAppointment.serviceType = .petvisit
        selectedAppointment.petName = "Beans"
        // 把这个实例作为sender传给segue
        performSegue(withIdentifier: "appointmentSettingSegue", sender: selectedAppointment)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // 用guard做安全的类型转换,避免强制解包崩溃
        guard let nav = segue.destination as? UINavigationController,
              let apptOrderVC = nav.topViewController as? AppointmentScreenTableViewController,
              let selectedAppt = sender as? Appt else {
            apptOrderVC?.appointmentTypeString = "fail"
            return
        }

        switch selectedAppt.petName {
        case "Beans":
            apptOrderVC.appointmentTypeString = "Beans"
        default:
            apptOrderVC.appointmentTypeString = "fail"
        }
    }
}

方案2:检查并修正Segue的关联方式

如果一定要用全局变量,先确认你的segue是从按钮直接拖到目标导航控制器创建的:

  • 右键点击你的myFirstButton,按住鼠标拖到目标导航控制器上
  • 在弹出的菜单中选择合适的segue类型(比如show)
  • 给segue命名为appointmentSettingSegue

这样点击按钮时,系统会先执行IBAction里的变量设置逻辑,再触发segue的prepare方法,就能拿到正确的值了。

额外建议:给Appt类添加默认值检查

确保你的Appt类中petName的默认值是明确的,比如:

enum ServiceType {
    case petvisit
    // 你的其他枚举值
}

struct Appt {
    var serviceType: ServiceType?
    var petName: String = "" // 默认空字符串,避免nil导致的意外问题
}

慢慢来,刚开始写iOS遇到这种变量生命周期的问题很正常,多踩几次坑就懂啦😉

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:18:28