使用委托将数据传递回以前的VC并更新自定义单元 [英] Pass data back to previous VC using delegates and update custom cell

查看:74
本文介绍了使用委托将数据传递回以前的VC并更新自定义单元的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用委托将数据BACK传递到先前的viewController.

I am trying to pass data BACK to the previous viewController using delegates.

有人知道如何将数据从ViewController B传递回ViewController A吗?

Does anyone know how to pass data back from ViewController B to ViewController A?

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

So I want to pass data from SecondVC to FirstVC and update custom table view cells with the data from SecondVC 4 address text fields but for some reason, it's not updating at all.

任何帮助将不胜感激,因为我才刚刚起步,因此尝试了各种尝试,但无法使其正常工作.

Any help will be much appreciated as I'm just at the beginning level so tried all sorts of things but not able to get it to work.

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
    }

}

推荐答案

检查以下已更正的代码:

Check below corrected code:

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
    }
}

您的结果将是:

此处是您的更新代码.

这篇关于使用委托将数据传递回以前的VC并更新自定义单元的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆