如何将选定的数据从 PopUpTableViewController 传递到 Swift 中的其他 TableViewController?

How to pass selected data from a PopUpTableViewController to other TableViewController in Swift?

我有 2 个视图控制器:在第一个 ViewController 中有一个 TableView,我在每个 TableViewCell 中都有一个按钮 select 一个运送选项。单击该按钮时,将弹出另一个 TableViewController,其中包含运输选项列表。选择运输选项后,我需要在第一个 ViewController 中将此数据传回 TableViewCell。我写了下面的代码,但是第二个表 ViewController 中的运输选项 select 仍然没有传递给第一个控制器。其他事情工作正常。谁能帮助我知道如何改进这段代码?百万感谢!

//第一个ViewController:

class PaymentMethodViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    //MARK: - IBOutlets

    @IBOutlet weak var PurchasedReviewItemsTableView: UITableView!

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 5
    }


    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "PurchasedReviewItemsTableViewCell") as! PurchasedReviewItemsTableViewCell

        cell.delegate = self

    }

}

extension PaymentMethodViewController: PurchasedReviewItemsTableViewCellDelegate {

    func chooseShippingOptionButtonPressed() {

        let chooseShippingOptionVC = UIStoryboard.init(name: "Main", bundle: nil).instantiateViewController(identifier: "ShippingOptionsSelectionPopUpViewController") as! ShippingOptionsSelectionPopUpViewController

        chooseShippingOptionVC.modalPresentationStyle = .overCurrentContext

        self.present(chooseShippingOptionVC, animated: true, completion: nil)
    }

    //MARK: Pass data from popUpView

    func popUpShippingOptionsSelected(shippingOption: String) {

        let cell = PurchasedReviewItemsTableView.dequeueReusableCell(withIdentifier: "PurchasedReviewItemsTableViewCell") as! PurchasedReviewItemsTableViewCell
        cell.shippingOptionsLabel.text = shippingOption

    }

}

//第一个TableViewCell ViewController:

protocol PurchasedReviewItemsTableViewCellDelegate {

    func chooseShippingOptionButtonPressed()

    func popUpShippingOptionsSelected(shippingOption: String)
}


class PurchasedReviewItemsTableViewCell: UITableViewCell {

    @IBOutlet weak var shippingOptionsLabel: UILabel!

    var delegate: PurchasedReviewItemsTableViewCellDelegate?
    @IBAction func changeShippingOptionButtonPressed(_ sender: Any) {

        delegate?.chooseShippingOptionButtonPressed()   
    }

}

//第二表ViewController:

class ShippingOptionsSelectionPopUpViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    var selectedShippingOption : String?

    var shippingOption = ["X", "Y"]

    var delegate: ShippingOptionsSelectionPopUpDelegate?

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        2
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "ShippingOptionsSelectionPopUpTableViewCell", for: indexPath) as! ShippingOptionsSelectionPopUpTableViewCell

        cell.selectShippingOption(shippingOption: shippingOption[indexPath.row])

        return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        selectedShippingOption = shippingOption[indexPath.row]

        delegate?.popUpShippingOptionsSelected(shippingOption: selectedShippingOption!)

        dismiss(animated: true, completion: nil)


    }
}

为 popUpShippingOptionsSelected 定义单独的协议

protocol ShippingOptionsDelegate {

func popUpShippingOptionsSelected(shippingOption: String)
}

class ShippingOptionsSelectionPopUpViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

var selectedShippingOption : String?

var shippingOption = ["X", "Y"]

var shippingOptiondelegate: ShippingOptionsSelectionPopUpDelegate?

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            2
        }

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "ShippingOptionsSelectionPopUpTableViewCell", for: indexPath) as! ShippingOptionsSelectionPopUpTableViewCell

        cell.selectShippingOption(shippingOption: shippingOption[indexPath.row])

        return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        selectedShippingOption = shippingOption[indexPath.row]

        shippingOptiondelegate?.popUpShippingOptionsSelected(shippingOption: selectedShippingOption!)

        dismiss(animated: true, completion: nil)


    }
}

向单元格添加标签

class PaymentMethodViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

//MARK: - IBOutlets

@IBOutlet weak var PurchasedReviewItemsTableView: UITableView!

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 5
}



func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

let cell = tableView.dequeueReusableCell(withIdentifier: "PurchasedReviewItemsTableViewCell") as! PurchasedReviewItemsTableViewCell

cell.delegate = self
cell.tag = 100 // Set tag

}

}

使用 ShippingOptionsDelegate 更新扩展

extension PaymentMethodViewController: PurchasedReviewItemsTableViewCellDelegate, ShippingOptionsDelegate  {

func chooseShippingOptionButtonPressed() {

            let chooseShippingOptionVC = UIStoryboard.init(name: "Main", bundle: nil).instantiateViewController(identifier: "ShippingOptionsSelectionPopUpViewController") as! ShippingOptionsSelectionPopUpViewController
             chooseShippingOptionVC.shippingOptiondelegate = self
             chooseShippingOptionVC.modalPresentationStyle = .overCurrentContext

             self.present(chooseShippingOptionVC, animated: true, completion: nil)
}

//MARK: Pass data from popUpView

func popUpShippingOptionsSelected(shippingOption: String) {

        let cell = PurchasedReviewItemsTableView.viewWithTag(100) as! PurchasedReviewItemsTableViewCell // use tag to get cell
        cell.shippingOptionsLabel.text = shippingOption

}

}