[英]cellForRow returns nil - swift 3
我调用JSON并将数据保存在数组上,然后重新加载tableView,当我使用dequeueReusableCell
一切正常,但是当我更改为cellForRow
每次设置单元格时都会崩溃。 我使用cellForRow的原因是,我需要在用户单击它之后更改单元格的图像,但是如果我使用dequeueReusableCell
我会进行多次更改(因为该单元格始终可以重复使用)。
我在let cell = tableView.cellForRow(at: indexPath) as! TicketTableViewCell
崩溃了let cell = tableView.cellForRow(at: indexPath) as! TicketTableViewCell
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
}
返回使用dequeueReusableCell
在didSelectRowAt
更改要使用的图像,或在数据集中的某个位置设置一个值,然后重新加载该行
确保cellForRowAt
方法使用已设置的更新的图像或标志,然后重新绘制单元格。
在数据源方法tableView(:cellForRowAt:)
您不能使用tableView.cellForRow(at: indexPath)
因为第二种方法只是将您先前在第一种方法中提供的单元格还给您。
如果您有索引路径,则应从表视图中获取一个单元格。 您无法绕过表视图的视图重用,而必须使用出队。
如果问题是您“进行了多次更改(由于单元始终处于重复使用状态”),则需要确保单元已为重新使用做好了适当的准备,并且/或者仅设置了一次。
我不确定您的实现是什么,但是当您的视图控制器被调用时,用户单击了单元格(从按钮或手势识别器),您应该传递单元格本身,因为如果您拥有该单元格,则可以调用tableview.indexPathForCell()
并知道单击了哪个indexPath,因此您将知道用于更新此单元格的数据。 希望这可以帮助。
编辑:(在您要跟踪的意义上,“单元格是'选定的',而不是单元格的selected
属性,如果要使用的话,它全都不同)。 您还应该跟踪当前选定的索引,并在数据源方法中以不同的方式设置单元格的格式,以防用户在屏幕外滚动选定的单元格并向后滚动选定的单元格。
让数据源方法检查是否选择了一个单元很重要,因为这也使您可以随意加载任何您认为可能有更改的单元。 但这不是一个好习惯(但简单又好!),更好的是,如果您拥有该单元格,则可以直接设置其属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.