将信息发送到另一个视图控制器
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
对象。一般概念是相似的,但使用选择器视图来解释表视图问题的答案似乎很奇怪。以上是关于将信息发送到另一个视图控制器的主要内容,如果未能解决你的问题,请参考以下文章