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
相关产品推荐
相关产品推荐

