Ios 将信息发送到另一个视图控制器
我在获取表视图单元格的Indexpath并将其发送到下一页时遇到问题Ios 将信息发送到另一个视图控制器,ios,swift,uitableview,firebase,firebase-realtime-database,Ios,Swift,Uitableview,Firebase,Firebase Realtime Database,我在获取表视图单元格的Indexpath并将其发送到下一页时遇到问题 var bookName: String? func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cells", for: indexPath) as! P
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。问题是它准确地捕获了一些标题,有时它不能准确地捕获标题,我不知道为什么。
cellForRowAt
方法用于创建视图,在本例中是一个表视图单元格,然后将其提供给表视图显示。当表格视图加载数据时,您将看到,比如10个单元格。所以这个函数被调用10次来准备10个单元格。因此,在上一次,索引行将是9,而bookName
属性将是post
数组的第10个
现在假设你向下滚动一点,然后一直向上滚动,最后一个准备好的单元格就是第一个单元格。因此,现在您的bookName
将成为post数组的第一个。这就是为什么你的书名不正确
要解决您的问题,您只需要在用户单击单元格后获取特定的图书名称。因此,删除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
}
您需要实现tableView委托方法
tableView(ux0:didSelectRowAt:)
。在该方法中,将选定的indexPath保存到实例变量并调用segue
然后在prepareForSegue中,使用保存的indexPath索引到数据模型中,并获取所选单元格的数据。(标题字符串,在您的情况下。)不要从单元格视图中获取数据。视图不是用来存储数据的。当我这样做并单击单元格时,它会崩溃,并显示致命错误:在打开可选的value@juelizabeth您的表视图是基于此
posts
数组填充的吗?OP询问的是表视图,而不是UIPickerView
对象。一般的概念类似,但使用选择器视图解释表视图问题的答案似乎有些奇怪。