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

如何通过结构体实现第二个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)
    }
}

补充优化(可选)

如果不想用全局变量,也可以通过闭包回调传递结构体实例,代码耦合度更低:

  1. 在第二个VC中新增回调属性:
var updateHandler: ((UserDemographics) -> Void)?
  1. 第二个VC返回时调用回调传递最新结构体:
let newInfo = UserDemographics(
    name: txtFldName.text ?? "",
    rollNumber: Int(txtFldRollNumber.text ?? "0") ?? 0
)
updateHandler?(newInfo)
  1. 第一个VC跳转时接收回调,直接更新UI:
vc.updateHandler = { [weak self] newInfo in
    self?.txtNames.text = newInfo.name
    self?.txtRollNumber.text = "\(newInfo.rollNumber)"
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:06:03