使用委托将数据传回上一个VC并更新自定义单元格
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用委托将数据传回上一个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)
}
}
}
}
定制单元格
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
}
}
你的结果将是:
而here是您的更新代码。
另一答案
维护包含数据的数组。
//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
}
以上是关于使用委托将数据传回上一个VC并更新自定义单元格的主要内容,如果未能解决你的问题,请参考以下文章
UICollectionView 单元格的自定义委托 - 自定义按钮不起作用
iPhone:如何在自定义单元的动态数量上管理 UITextfield 委托方法
如何将 UITextView 嵌入 UITableViewCell 与作为委托的自定义单元格?