使用委托将数据传递回以前的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 } }
此外,您应该以驼峰大小写格式声明您的属性名称。