我调用JSON并将数据保存在数组中,在重新加载tableView之后,当我使用dequeueReusableCell时一切正常,但是当我更改为cellForRow时,每次设置单元格时都会崩溃。使用cellForRow的原因是我需要在用户单击该单元格后更改它的图像,但是如果我使用dequeueReusableCell,则会得到多个更改(因为该单元格总是被重用)。
我在let cell = tableView.cellForRow(at: indexPath) as! TicketTableViewCell撞车了。我已经做了一次搜索,但没有任何帮助。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.cellForRow(at: indexPath) as! TicketTableViewCell
//let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TicketTableViewCell
cell.date.text = arrDate[indexPath.row].date
//Top Bottom Space.
let maskLayer = CAShapeLayer()
let bounds = cell.bounds
maskLayer.path = UIBezierPath(roundedRect: CGRect(x: 2, y: 2, width: bounds.width-4, height: bounds.height-4), cornerRadius: 2).cgPath
cell.layer.mask = maskLayer
return cell
}发布于 2017-01-27 16:50:12
在数据源方法tableView(:cellForRowAt:)中,您不能使用tableView.cellForRow(at: indexPath),因为第二个方法只是返回以前在第一个方法中给出的单元格。
如果您有索引路径,它意味着从表视图中取回一个单元格。您不能绕过表视图的视图-重用,您必须使用dequeue。
如果问题是“获得多个更改(因为单元总是被重用)”,则需要确保单元格为重用做好了适当的准备,并且/或只设置了一次。
我不知道您的实现是什么,但是当您的视图控制器被调用时,当您的视图控制器被调用时,用户已经单击了该单元格(通过按钮或手势识别器),您应该传递该单元格本身,因为如果您拥有该单元格,您可以调用tableview.indexPathForCell()并知道单击了哪个indexPath,因此您将知道要用什么数据更新这个单元格。希望这能有所帮助。
编辑:(如果您想使用所有不同的单元格,则在跟踪的意义上,单元格是“选定的”,而不是单元格的selected属性)。您还应该跟踪当前选定的索引,并在数据源方法中以不同的格式设置单元格,以防用户在屏幕外滚动选定的单元格并将其返回。
让数据源方法检查是否选择了一个单元格很重要,因为它还允许您随意地重新加载任何您认为可能发生更改的单元格。但这不是很好的练习(但简单又好!)更好的是,如果您有单元格,您可以直接设置它的属性。
发布于 2017-01-27 16:21:29
回到使用dequeueReusableCell
在didSelectRowAt中,更改要使用的映像,或在数据集中的某个位置设置值,然后重新加载该行
确保cellForRowAt方法使用您设置的更新图像或标志,并重新绘制单元格。
https://stackoverflow.com/questions/41898389
复制相似问题