如何通过结构体实现第二个VC向第一个VC传递UITextField数据
实现方案
你当前的代码用全局结构体实例做正向传值,要实现第二个VC向第一个VC反向传值,可以基于现有逻辑调整如下:
1. 结构体定义(全局共享载体)
import Foundation // 定义存储用户信息的结构体 struct UserDemographics { var name = "" var rollNumber = 0 } // 全局共享的结构体实例,作为跨页面数据传递的载体 var sharedDemographics: UserDemographics?
2. 第一个视图控制器(接收反向传值)
增加页面生命周期监听,回到页面时自动读取结构体的最新值更新UI:
import UIKit class ViewController: UIViewController { @IBOutlet weak var txtNames: UITextField! @IBOutlet weak var txtRollNumber: UITextField! override func viewDidLoad() { super.viewDidLoad() } // 页面每次即将显示时,读取结构体最新值更新输入框 override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) guard let info = sharedDemographics else { return } txtNames.text = info.name txtRollNumber.text = "\(info.rollNumber)" } // 跳转到第二个页面的按钮点击事件 @IBAction func actionNext(_ sender: UIButton) { // 先把当前页面输入值存入共享结构体 sharedDemographics = UserDemographics( name: txtNames.text ?? "", rollNumber: Int(txtRollNumber.text ?? "0") ?? 0 ) // 初始化第二个页面并跳转 let vc = storyboard?.instantiateViewController(withIdentifier: "ViewController2") as! ViewController2 self.navigationController?.pushViewController(vc, animated: true) } }
3. 第二个视图控制器(发送反向传值)
增加返回按钮逻辑,修改完内容后把最新值写入共享结构体再返回:
import UIKit class ViewController2: UIViewController { @IBOutlet weak var txtFldName:UITextField! @IBOutlet weak var txtFldRollNumber:UITextField! override func viewDidLoad() { super.viewDidLoad() // 页面加载时读取结构体的初始值填充输入框 guard let info = sharedDemographics else { return } txtFldName.text = info.name txtFldRollNumber.text = "\(info.rollNumber)" } // 返回第一个页面的按钮点击事件 @IBAction func actionBack(_ sender: UIButton) { // 把当前页面输入的最新值更新到共享结构体 sharedDemographics?.name = txtFldName.text ?? "" sharedDemographics?.rollNumber = Int(txtFldRollNumber.text ?? "0") ?? 0 // 执行返回操作 self.navigationController?.popViewController(animated: true) } }
补充优化(可选)
如果不想用全局变量,也可以通过闭包回调传递结构体实例,代码耦合度更低:
- 在第二个VC中新增回调属性:
var updateHandler: ((UserDemographics) -> Void)?
- 第二个VC返回时调用回调传递最新结构体:
let newInfo = UserDemographics( name: txtFldName.text ?? "", rollNumber: Int(txtFldRollNumber.text ?? "0") ?? 0 ) updateHandler?(newInfo)
- 第一个VC跳转时接收回调,直接更新UI:
vc.updateHandler = { [weak self] newInfo in self?.txtNames.text = newInfo.name self?.txtRollNumber.text = "\(newInfo.rollNumber)" }
内容的提问来源于stack exchange,提问作者Deepaman Bawa
相关产品推荐
相关产品推荐

