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

Posted

技术标签:

【中文标题】将信息发送到另一个视图控制器【英文标题】:Send information to another View controller 【发布时间】:2017-07-14 00:41:00 【问题描述】:

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

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。问题是它准确地捕获了一些标题,有时它不能准确地捕获标题,我不知道为什么。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

现在假设您向下滚动一点,然后一直向上滚动,最后准备好的单元格是第一个单元格。所以现在你的bookName 将是你的帖子数组的第一个。这就是为什么您的书名不正确。

要解决您的问题,您只需要在用户单击单元格后获取特定的书名。所以删除在你的cellForRow方法中为bookName赋值的代码,然后像这样添加另一个委托函数

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

【讨论】:

当我这样做并单击单元格时,它崩溃并说致命错误:在展开可选值时意外发现 nil @juelizabeth 您的表格视图是否基于此 posts 数组填充? OP 询问的是表视图,而不是 UIPickerView 对象。一般概念是相似的,但使用选择器视图来解释表视图问题的答案似乎很奇怪。

以上是关于将信息发送到另一个视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

将数组从自定义单元格发送到另一个视图控制器

将数据从视图控制器发送到另一个

IOS - 从表视图控制器获取值并将其发送到另一个表视图控制器

如何快速将一个视图控制器值发送到另一个视图控制器表视图?

将数组数据从一个视图控制器发送到另一个

如何将数据从一个视图控制器发送到另一个视图控制器[重复]