iOS开发:如何从MainVC向CountdownVC传递Int类型值
解决Segue跳转时传递Int值到CountdownVC的问题
嘿,我看你当前的代码问题出在手动创建CountdownVC实例并赋值,和Segue实际跳转的实例不是同一个——你写的let vc = CountdownVC()只是在内存里新建了一个控制器对象,但Segue跳转时会自己创建一个全新的CountdownVC实例,所以你之前赋值的vc.seconds = 60根本不会作用到跳转后的那个页面上,这就是为什么你的传值没效果。
下面给你两种靠谱的解决方案,选哪种都可以:
方案1:用临时属性记录选中的秒数,在prepare方法中传递
这个方法逻辑直观,适合新手:
- 首先在MainVC里添加一个临时属性,用来存用户点击按钮对应的秒数:
class MainVC: UIViewController { // 用来临时存储选中的倒计时秒数 var selectedSeconds: Int = 0 // 你的1分钟按钮点击方法 @IBAction func oneMinuteBtnPressed(_ sender: Any) { selectedSeconds = 60 performSegue(withIdentifier: "toCountdownVC", sender: self) } // 其他按钮的点击方法同理,比如2分钟按钮 @IBAction func twoMinutesBtnPressed(_ sender: Any) { selectedSeconds = 120 performSegue(withIdentifier: "toCountdownVC", sender: self) } }
- 然后在MainVC里实现
prepare(for:sender:)方法——这个方法是Segue跳转前系统会自动调用的,我们在这里给目标控制器赋值:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // 先判断是不是我们要的那个Segue,同时安全转成目标控制器类型 guard segue.identifier == "toCountdownVC", let countdownVC = segue.destination as? CountdownVC else { return } // 把临时存储的秒数传递过去 countdownVC.seconds = selectedSeconds }
方案2:直接通过按钮Sender判断,在prepare方法中赋值
如果不想加临时属性,可以给每个按钮设置Tag,然后在跳转时直接识别:
- 先给每个按钮设置对应的Tag值(比如1分钟按钮Tag设为60,2分钟设为120,以此类推,直接用秒数当Tag很方便),然后把所有按钮的IBAction关联到同一个方法:
class MainVC: UIViewController { @IBAction func countdownBtnPressed(_ sender: UIButton) { // 直接把按钮作为sender传递给Segue performSegue(withIdentifier: "toCountdownVC", sender: sender) } }
- 同样实现
prepare(for:sender:)方法,通过按钮的Tag获取对应的秒数:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { guard segue.identifier == "toCountdownVC", let selectedBtn = sender as? UIButton else { return } let countdownVC = segue.destination as! CountdownVC // 直接用按钮的Tag作为秒数(前提是你已经给按钮设置了正确的Tag) countdownVC.seconds = selectedBtn.tag }
最后要注意的点
确保你的CountdownVC里的seconds属性是可以被外部访问的,不要加private修饰符:
class CountdownVC: UIViewController { // 这里不要加private,让MainVC能直接赋值 var seconds: Int = 0 override func viewDidLoad() { super.viewDidLoad() // 这里就可以使用seconds来处理倒计时逻辑了,比如转成分钟 let minutes = seconds / 60 print("即将开始\(minutes)分钟倒计时") } }
这样修改后,点击按钮跳转时,CountdownVC就能拿到正确的秒数啦!
内容的提问来源于stack exchange,提问作者Joe Vargas
相关产品推荐
相关产品推荐

