如何正确地将数据从一个ViewController的选定单元格传递到以前的ViewController?

时间:2018-08-06 05:28:24

标签: swift uiviewcontroller tableview

假设我有两个名为A和B的视图控制器。在我的视图控制器B中,我有一个表视图。当我在表格视图中选择一个单元格时,我想将该信息传递回A。

我有一个以下字典:

myData = [String: DataModel]

DataModel的形式为

struct DataModel{
    var address = ""
    var name = ""
}

我想将B中所选单元格的密钥发送回A。我应该如何做?

感谢您的帮助

3 个答案:

答案 0 :(得分:2)

  1. class BViewController:

    之前添加它
    protocol ClassBViewControllerDelegate: class {
        func didSelectTableViewCell(onRow row: Int)
    }
    
  2. BViewController中创建委托属性:

    weak var delegate: ClassBViewControllerDelegate?
    
  3. 实现tableView委托方法tableView(_:didSelectRowAt:)

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath:NSIndexPath) {
            let row = indexPath.row
            delegate?.didSelectTableViewCell(onRow: row)
    }
    
  4. 告诉ClassAViewController这样符合ClassBViewControllerDelegate

    class ClassAViewController: UIViewController, ClassBViewControllerDelegate {
    
  5. ClassAViewController的适当位置绑定ClassBViewControllerClassAViewController,例如prepareForSegue:sender:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "SegueIdentifierXYZ" {
            if let vc = segue.destination as? ClassBViewController {
                vc.delegate = self
            }
        }
    }
    
  6. 使用didSelectTableViewCell(onRow row: Int)中的委托合同的委托方法ClassBViewControllerDelegate ClassAViewController

    func didSelectTableViewCell(onRow row: Int) {
        print("Selected table view row is:", row)
    }
    

答案 1 :(得分:0)

使用完成块或使用委托可以实现此目的。 使用块,您可以像这样进行编码:

在您的B VC中为完成区块创建一个属性。

var cellSelectionCallBackHandler: ((DataModel, Int) -> Void)?

cellSelectionCallBackHandler设置VC A属性。

VCObjectB.cellSelectionCallBackHandler = { (data, index) in
 // Use your data here
}

VC B调用完成处理程序,选择像这样的单元格

cellSelectionCallBackHandler?(yourData, index)

任何疑问,请发表评论。

答案 2 :(得分:0)

可以使用委托方法来实现它。呼叫解散B的位置/方法呼叫代表。您可以在A中实现此委托。

您还可以拥有一个singleton dataHandler类,您可以在其中设置和获取所需的属性,并可以从项目中的任何位置访问它。