Swift 3 - 如何为每个表视图单元格传递唯一信息

时间:2017-03-06 00:05:02

标签: ios swift swift3

我正在使用Swift 3和Xcode 8.2。

您好,我将尝试充分解释我正在尝试做什么以及我做了什么,希望有人可以帮助我充实我的问题。

这是我的故事板。

enter image description here

它是标签栏控制器的第一个标签。它由一个表视图控制器(我们称之为表1)组成,单击它时单元格将显示另一个具有唯一信息的表视图控制器(表2)。例如,表1中的单元格标题为“水果”,“蔬菜”,“蛋白质”,单击“水果”时,表2显示“Apple”,“Orange”,“Pear”。

所以我的第一个问题是:我的故事板设置是否准确捕获了我希望表2单元格独特的行为,具体取决于表1中单击的内容?或表2的单元格是否完全相同?

继续:我已经成功生成了表1中的内容,但表2中的独特内容给我带来了麻烦。

表2内容在Tab Bar Controller的另一个选项卡上生成,我需要先将其传递到该视图中。

所以,在另一个标签中,我试图做这样的事情。基本上,尝试访问表2并在其中设置字段也会填充。

let table2VC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "table2VC") as! Table2VC
table2VC.unique_title_label = UILabel()
table2VC.unique_title_label.text = "Some unique text"

表2 VC

var unique_title_label : UILabel!

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    ... 
    table2cell.titleLabel = unique_title_label
    table2cell.mytvc = self
    return table2cell
}

在Table2Cell中:

@IBOutlet weak var titleLabel : UILabel!

我已将插座与相应的表2标签相关联。但是,运行此选项时,不会填充任何唯一标签。它简单地说“标签”就像故事板一样。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

所以你希望在两个UITableViewControllers之间传递数据。首先,您需要考虑一下data structure,这意味着您需要在第一个tableView中显示数据,当然还需要在第二个tableView中显示数据。 由于第二个tableView正在等待第一个填充。所以你的数据结构非常重要。

例如:

struct personInfo {
    var firstName:String
    var lastName:String
    var detailInfos:[String]
}

因此,在第一个TableView中,如您所知,每个都包含自己的数据,这意味着在当前示例中,每行将包含firstnamelastnamedetailInfos。< / p>

由于您使用的是tableView,因此您可以使用prepare(for segue: UIStoryboardSegue, sender: Any?)tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)不要同时使用两者,因为在didSelectRowAt之前调用prepare会给您带来奇怪的行为。

我有完整的例子:

struct personInfo {
    var firstName:String
    var lastName:String
    var detailInfos:[String]
}

enum segueIdentifier:String {
    case first_id = "passDataViaSegue"
}

class FirstTableView: UITableViewController {

    var personInfos:[personInfo]!

    override func viewDidLoad() {
        super.viewDidLoad()
        personInfos  = [ personInfo(firstName: "Joe", lastName: "Doe", detailInfos: [
                "we need this datat","we are here my man","I am not amateur"
            ])
        ]
        tableView.delegate = self
        tableView.dataSource = self
        tableView.reloadData()

    }

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


    override func tableView(_ tableView:UITableView, cellForRowAt indexPath:IndexPath)->UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = personInfos[indexPath.row].firstName
        cell.detailTextLabel?.text = personInfos[indexPath.row].lastName
        return cell
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == segueIdentifier.first_id.rawValue {
            let destination = segue.destination as! SecondTableView
            guard  let row  = tableView.indexPathForSelectedRow?.row else {
                return
            }
            destination.detailArr = personInfos[row].detailInfos
        }
    }

}

class SecondTableView: UITableViewController {

    var detailArr:[String]?

    var _details = [String]()

    override func viewDidLoad() {
        super.viewDidLoad()

        guard let details = detailArr else { return }
        _details = details
        DispatchQueue.main.async {
          self.tableView.reloadData()
        }
    }

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


    override func tableView(_ tableView:UITableView, cellForRowAt indexPath:IndexPath)->UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = _details[indexPath.row]
        return cell
    }
}

在此示例中,我使用的设置与您的设置相同,只是使用不同的数据,默认为TableViewCell