将信息发送到另一个视图控制器

时间:2017-07-14 00:41:01

标签: ios swift uitableview firebase firebase-realtime-database

我无法获取表格视图单元格的索引路径并将其发送到下一页。

var bookName: String?

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cells", for: indexPath) as! ProfileTableViewCell

    print(posts[indexPath.row])
    let post = self.posts[indexPath.row] as! [String: AnyObject]
    self.bookName = post["title"] as? String
}

override public func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    guard segue.identifier == "sendMessageToUser", let chatVc = segue.destination as? SendMessageViewController else {
        return
    }
    chatVc.bookName = self.bookName
}

所以我试图捕获我点击的任何单元格的标题并将其发送到SendMessageViewController。问题在于它准确地捕获了一些标题,有时它没有准确地捕捉标题,我不确定为什么。

2 个答案:

答案 0 :(得分:2)

您需要实现表视图委托方法tableView(_:didSelectRowAt:)。在该方法中,将选定的indexPath保存到实例变量并调用您的segue。

然后在prepareForSegue中,使用保存的indexPath索引到数据模型并获取所选单元格的数据。 (标题字符串,在您的情况下。)不要从单元格的视图中获取数据。视图不用于存储数据。

答案 1 :(得分:1)

cellForRowAt方法用于创建视图,在本例中为表视图单元格,然后将其提供给表视图以进行显示。当表视图加载数据时,您将看到10个单元格。所以这个函数被调用10次来准备10个细胞。因此,在上一次,索引行将为9,您的bookName属性将是post数组的第10个。

现在说你向下滚动一点然后向上滚动,准备好的最后一个单元格是第一个单元格。所以现在你的bookName将是你的第一个帖子阵列。这就是为什么你的书名不正确的原因。

要解决您的问题,您只需在用户点击单元格后获取特定的书名。因此,请删除在bookName方法中为cellForRow分配值的代码,然后再添加另一个委托函数

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let post = self.posts[indexPath.row] as! [String: AnyObject]
     self.bookName = post["title"] as? String
}