我无法获取表格视图单元格的索引路径并将其发送到下一页。
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。问题在于它准确地捕获了一些标题,有时它没有准确地捕捉标题,我不确定为什么。
答案 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
}