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

TextField输入数据无法传递至另一ViewController的Label问题求助

解决ViewController间多数据传递问题:用User结构体优化数据传递

你的代码问题确实出在personalData变量上——它是字符串类型,每次赋值都会覆盖之前的内容,最后只会保留最后一次赋值的邮箱文本,而且第二个VC的四个Label都绑定同一个值,自然没法正确显示四个不同的输入内容。按照导师的建议,我们可以通过定义User结构体来封装多字段数据,一次性完成传递。

修改后的完整代码

第一个ViewController(ViewController.swift)

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var name: UITextField!
    @IBOutlet weak var age: UITextField!
    @IBOutlet weak var city: UITextField!
    @IBOutlet weak var mail: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let tap = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard))
        view.addGestureRecognizer(tap)
    }
    
    @objc func edit() {
        print("Edit is done")
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        guard segue.identifier == "personalData" else { return }
        guard let destination = segue.destination as? SecondViewController else { return }
        
        // 创建User实例,封装所有输入数据
        let userData = User(
            name: name.text ?? "",
            age: age.text ?? "",
            city: city.text ?? "",
            mail: mail.text ?? ""
        )
        destination.personalData = userData
    }
    
    @objc func dismissKeyboard() {
        view.endEditing(true)
    }
}

第二个ViewController(SecondViewController.swift)

import UIKit

// 定义User结构体,包含需要传递的所有字段
struct User {
    let name: String
    let age: String
    let city: String
    let mail: String
}

class SecondViewController: UIViewController {
    
    // 修改personalData为User类型
    var personalData: User!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 将结构体的每个属性对应到不同Label
        firstProfileLabel.text = personalData.name
        secondProfileLabel.text = personalData.age
        thirdProfileLabel.text = personalData.city
        lastProfileLabel.text = personalData.mail
        
        print("SecondVC", #function)
        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .edit,
                                                            target: self,
                                                            action: #selector(edit))
    }
    
    @objc func edit() {
        print("Edit is done")
    }
    
    @IBOutlet weak var firstProfileLabel: UILabel!
    @IBOutlet weak var secondProfileLabel: UILabel!
    @IBOutlet weak var thirdProfileLabel: UILabel!
    @IBOutlet weak var lastProfileLabel: UILabel!
}

关键修改点说明

  • 定义User结构体:在SecondViewController中(也可以单独创建Swift文件存放)定义包含name、age、city、mail四个属性的结构体,用来统一封装需要传递的多组数据。
  • 修改数据传递逻辑:在第一个VC的prepare(for:sender:)方法中,不再多次覆盖personalData,而是创建一个User实例,把四个TextField的内容赋值给对应属性后,一次性传递给第二个VC。
  • 绑定Label到结构体属性:在第二个VC的viewDidLoad中,将每个Label分别绑定到User结构体的不同属性,这样就能显示对应的输入内容了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 19:35:45