繁体   English   中英

cellForRow返回nil-swift 3

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM