如何在Swift中的两个表视图控制器之间交换信息?

时间:2016-12-01 10:32:15

标签: ios swift viewcontroller

我是Swift的新手。我有两个table view controllers,一个有静态单元格,另一个有动态单元格。我基本上想让用户在第二个表视图控制器上选择他的婚姻状态,并将他的选择发送回第一个表视图控制器(并在单元格“Marital Status”上显示他的选择)。这是我的故事板的截图:

Storyboard

第二个表视图控制器上的当前代码:

import UIKit

class SecondTableViewController: UITableViewController {
     let maritalStatusArray: [String] = ["Single", "Married"]

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return  maritalStatusArray.count

    }


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

        let cell = tableView.dequeueReusableCell(withIdentifier: "MaritalStatusCell", for: indexPath)
        cell.textLabel?.text = maritalStatusArray[indexPath.row]
        return cell

    }
}

我的猜测是我必须将第二个视图控制器的动态单元格中的segue添加回第一个视图。是对的吗 ?

假设这是这样做的方法,我之后更新静态标签的文本以包括用户做出的选择。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

有几种方法可以实现回调功能来传递数据。

  1. 代表
  2. 使用Block CallBack
  3. 发布通知
  4. 但我建议使用委托,这是最好的方式,发布通知也是一种方式,但我不想更喜欢。

答案 1 :(得分:1)

您可以使用自定义委托执行此操作:

ViewController.swift:

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, SecondViewControllerProtocol {

    @IBOutlet weak var userInfoTableView: UITableView!

    var userInfoArray: [String] = []


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        userInfoArray = ["Marital Status","Canton","Commune","Religion"]
       self.userInfoTableView?.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let userInfoCell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        userInfoCell.textLabel?.text = userInfoArray[indexPath.row]
        if indexPath.row == 0{
            userInfoCell.accessoryType = UITableViewCellAccessoryType.disclosureIndicator
        }
        return userInfoCell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if indexPath.row == 0{
            let secondVC = storyboard?.instantiateViewController(withIdentifier: "SecondViewControllerIdentifier") as! SecondViewController
            secondVC.statusDelegate = self
            self.navigationController?.present(secondVC, animated: true, completion: nil)
        }
    }

    func changeMaritalStatus(type: String){
        let  maritalStatusCell = userInfoTableView.cellForRow(at: IndexPath(row:0 , section:0))
        maritalStatusCell?.textLabel?.text = String("Marital Status: \(type)")
    }
}

SecondViewController.swift:

import UIKit

protocol SecondViewControllerProtocol {
    func changeMaritalStatus(type: String)
}

class SecondViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var maritalStatusTableView: UITableView!

    var maritalStatusArray: [String] = []

    var statusDelegate  : SecondViewControllerProtocol? = nil

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        maritalStatusArray = ["Single","Married","Divorced"]
        self.maritalStatusTableView.register(UITableViewCell.self, forCellReuseIdentifier: "maritalStatuscell")
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let maritalStatusInfoCell = tableView.dequeueReusableCell(withIdentifier: "maritalStatuscell", for: indexPath)
        let infoLabel: UILabel = UILabel.init(frame: CGRect(x: 10, y: 5, width: 250, height: 50))
        infoLabel.text = maritalStatusArray[indexPath.row]
        maritalStatusInfoCell.addSubview(infoLabel)
        return maritalStatusInfoCell
    }

     func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        statusDelegate?.changeMaritalStatus(type: maritalStatusArray[indexPath.row])
        self.dismiss(animated: true, completion: nil)
    }

}

GitHub链接:

https://github.com/k-sathireddy/CustomDelegatesSwift

输出: -

enter image description here