使用委托将数据传递回以前的VC并更新自定义单元格

我试图使用委托将数据BACK传递给以前的viewController

有谁知道如何将数据从ViewController B传递回ViewController A

所以我想将数据从SecondVC传递到FirstVC并使用来自SecondVC 4地址文本字段的数据更新自定义表格视图单元格,但由于某种原因,它根本没有更新。

任何帮助将非常感激,因为我只是在初级,所以尝试了各种各样的事情,但无法让它工作。

FirstVC

 import UIKit class MainVC: UIViewController, UITableViewDelegate, UITableViewDataSource, DataSentDelegate { @IBOutlet weak var deliveryAddress: UITableView! var customCell: AddressCell = AddressCell() override func viewDidLoad() { super.viewDidLoad() deliveryAddress.delegate = self deliveryAddress.dataSource = self deliveryAddress.reloadData() } func userDidEnterData(firstAddress: String, secondAddress: String, cityAddress: String, postcodeAddress: String) { customCell.firstLineAddressLbl?.text = firstAddress customCell.secondLineAddressLbl?.text = secondAddress customCell.cityLineAddressLbl?.text = cityAddress customCell.postcodeLineAddressLbl?.text = postcodeAddress } func numberOfSections(in tableView: UITableView) -> Int { return 1 } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 2 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "deliveryAddressCell", for: indexPath) as! AddressCell cell.updateUI() return cell } func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 165 } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "addDeliveryAddressVC" { let addDestination:AddingDestinationVC = segue.destination as! AddingDestinationVC addDestination.delegate = self } } } 

SecondVC

 import UIKit protocol DataSentDelegate { func userDidEnterData(firstAddress: String, secondAddress: String, cityAddress: String, postcodeAddress: String) } class AddingDestinationVC: UIViewController { @IBOutlet weak var firstLineAddressTextField: UITextField! @IBOutlet weak var secondLineAddressTextField: UITextField! @IBOutlet weak var cityLineAddressTextField: UITextField! @IBOutlet weak var postcodeLineAddressTextField: UITextField! var delegate: DataSentDelegate? override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } @IBAction func addBtnWasPressed(_ sender: Any) { if delegate != nil { if firstLineAddressTextField.text != nil { let firstLineAddress = firstLineAddressTextField.text print(firstLineAddress as Any) let secondLineAddress = secondLineAddressTextField.text let cityLineAddress = secondLineAddressTextField.text let postcodeLineAddress = postcodeLineAddressTextField.text delegate?.userDidEnterData(firstAddress: firstLineAddress!, secondAddress: secondLineAddress!, cityAddress: cityLineAddress!, postcodeAddress: postcodeLineAddress!) navigationController?.popViewController(animated: true) } } } } 

CustomCell

 import UIKit class AddressCell: UITableViewCell { @IBOutlet weak var firstLineAddressLbl: UILabel! @IBOutlet weak var secondLineAddressLbl: UILabel! @IBOutlet weak var cityLineAddressLbl: UILabel! @IBOutlet weak var postcodeLineAddressLbl: UILabel! @IBOutlet weak var numberLbl: UILabel! @IBOutlet weak var startBtn: UIButton! @IBOutlet weak var distanceLbl: UILabel! @IBOutlet weak var metricLbl: UILabel! func updateUI() { DeliveryDestinations(FirstLineAddress: firstLineAddressLbl.text, SecondLineAddress: secondLineAddressLbl.text, CityLineAddress: cityLineAddressLbl.text, PostCodeLineAddress: postcodeLineAddressLbl.text) } } 

模型文件

 import Foundation struct DeliveryDestinations { var FirstLineAddress: String? var SecondLineAddress: String? var CityLineAddress: String? var PostcodeLineAddress: String? init(FirstLineAddress: String? , SecondLineAddress: String?, CityLineAddress: String?, PostCodeLineAddress: String?) { self.FirstLineAddress = FirstLineAddress self.SecondLineAddress = SecondLineAddress self.CityLineAddress = CityLineAddress self.PostcodeLineAddress = PostCodeLineAddress } } 

检查以下更正的代码:

MainVC:

 import UIKit class MainVC: UIViewController, UITableViewDelegate, UITableViewDataSource, DataSentDelegate { @IBOutlet weak var deliveryAddress: UITableView! //Create array which will return your address data var addressArr = [DeliveryDestinations]() override func viewDidLoad() { super.viewDidLoad() deliveryAddress.delegate = self deliveryAddress.dataSource = self deliveryAddress.reloadData() } //add parameter for created address object func userDidEnterData(addressObj: DeliveryDestinations) { //append added object into your table array self.addressArr.append(addressObj) //Reload your tableview once your new object added. self.deliveryAddress.reloadData() } func numberOfSections(in tableView: UITableView) -> Int { return 1 } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { //change this with array count return addressArr.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "deliveryAddressCell", for: indexPath) as! AddressCell //get address object from array which you can assign to cell let addressObj = addressArr[indexPath.row] //assign data from array cell.updateUI(addressObj: addressObj) return cell } func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 165 } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "addDeliveryAddressVC" { let addDestination:AddingDestinationVC = segue.destination as! AddingDestinationVC addDestination.delegate = self } } } 

AddingDestinationVC:

 import UIKit protocol DataSentDelegate { //Replace parameter with DeliveryDestinations func userDidEnterData(addressObj: DeliveryDestinations) } class AddingDestinationVC: UIViewController { @IBOutlet weak var firstLineAddressTextField: UITextField! @IBOutlet weak var secondLineAddressTextField: UITextField! @IBOutlet weak var cityLineAddressTextField: UITextField! @IBOutlet weak var postcodeLineAddressTextField: UITextField! var delegate: DataSentDelegate? override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } @IBAction func addBtnWasPressed(_ sender: Any) { if delegate != nil { if firstLineAddressTextField.text != nil { //Create Model object DeliveryDestinations let addressObj = DeliveryDestinations(FirstLineAddress: firstLineAddressTextField.text, SecondLineAddress: secondLineAddressTextField.text, CityLineAddress: cityLineAddressTextField.text, PostCodeLineAddress: postcodeLineAddressTextField.text) //add that object to previous view with delegate delegate?.userDidEnterData(addressObj: addressObj) navigationController?.popViewController(animated: true) } } } } 

AddressCell:

 class AddressCell: UITableViewCell { @IBOutlet weak var firstLineAddressLbl: UILabel! @IBOutlet weak var secondLineAddressLbl: UILabel! @IBOutlet weak var cityLineAddressLbl: UILabel! @IBOutlet weak var postcodeLineAddressLbl: UILabel! @IBOutlet weak var numberLbl: UILabel! @IBOutlet weak var startBtn: UIButton! @IBOutlet weak var distanceLbl: UILabel! @IBOutlet weak var metricLbl: UILabel! func updateUI(addressObj: DeliveryDestinations) { //Drow your cell with values from addressObj firstLineAddressLbl.text = addressObj.FirstLineAddress secondLineAddressLbl.text = addressObj.SecondLineAddress cityLineAddressLbl.text = addressObj.CityLineAddress postcodeLineAddressLbl.text = addressObj.PostcodeLineAddress } } 

你的结果将是:

在此处输入图像描述

这是您更新的代码。

维护包含数据的数组。

 //In your MainVC var deliveryDestinationDataArray = [DeliveryDestinations]() 

在委托方法中,您需要将数据保存到数据源。

 func userDidEnterData(firstAddress: String, secondAddress: String, cityAddress: String, postcodeAddress: String) { let deliveryDestinationData = DeliveryDestinations(FirstLineAddress: firstAddress, SecondLineAddress: secondAddress, CityLineAddress: cityAddress, PostCodeLineAddress: postcodeAddress) deliveryDestinationDataArray.append(deliveryDestinationData) } 

cellForRowAtIndexPath中

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "deliveryAddressCell", for: indexPath) as! AddressCell cell.updateUI(deliveryDestinationData:deliveryDestinationDataArray[indexPath.row]) return cell } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { //change count with deliveryDestinationDataArray count return deliveryDestinationDataArray.count } 

用数据更新您的单元格

  func updateUI(with dataModel: DeliveryDestinations) { firstLineAddressLbl.text = dataModel.FirstLineAddress secondLineAddressLbl.text = dataModel.SecondLineAddress cityLineAddressLbl.text = dataModel.CityLineAddress postcodeLineAddressLbl.text = dataModel.PostcodeLineAddress } 

现在在viewWillAppear中 ,您需要重新加载tableview

 override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) deliveryAddress.reloadData() } 

用以下代码行替换您的FirstVC:

  import UIKit class MainVC: UIViewController, UITableViewDelegate, UITableViewDataSource, DataSentDelegate { @IBOutlet weak var deliveryAddress: UITableView! var dataModels: [DeliveryDestinations] = [DeliveryDestinations]() override func viewDidLoad() { super.viewDidLoad() deliveryAddress.delegate = self deliveryAddress.dataSource = self deliveryAddress.reloadData() } func userDidEnterData(firstAddress: String, secondAddress: String, cityAddress: String, postcodeAddress: String) { let newEntry: DeliveryDestinations = DeliveryDestinations(FirstLineAddress: firstAddress, SecondLineAddress: secondAddress, CityLineAddress: cityAddress, PostCodeLineAddress: postcodeAddress) dataModels.append(newEntry) deliveryAddress.reloadData() } func numberOfSections(in tableView: UITableView) -> Int { return 1 } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return dataModels.count() } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "deliveryAddressCell", for: indexPath) as! AddressCell let dataModel = dataModels[indexPath.row] cell.updateUI(with: dataModel) return cell } func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 165 } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "addDeliveryAddressVC" { let addDestination:AddingDestinationVC = segue.destination as! AddingDestinationVC addDestination.delegate = self } 

}

和自定义单元格类:

 import UIKit class AddressCell: UITableViewCell { @IBOutlet weak var firstLineAddressLbl: UILabel! @IBOutlet weak var secondLineAddressLbl: UILabel! @IBOutlet weak var cityLineAddressLbl: UILabel! @IBOutlet weak var postcodeLineAddressLbl: UILabel! @IBOutlet weak var numberLbl: UILabel! @IBOutlet weak var startBtn: UIButton! @IBOutlet weak var distanceLbl: UILabel! @IBOutlet weak var metricLbl: UILabel! func updateUI(with dataModel: DeliveryDestinations) { firstLineAddressLbl.text = dataModel.FirstLineAddress secondLineAddressLbl.text = dataModel.SecondLineAddress cityLineAddressLbl.text = dataModel.CityLineAddress postcodeLineAddressLbl.text = dataModel.PostcodeLineAddress } } 

此外,您应该以驼峰大小写格式声明您的属性名称。