2017-01-27 56 views
0

我打电话给一个JSON并将数据保存在一个数组上,然后重新加载tableView,当我使用dequeueReusableCell一切正常时,但是当我更改为cellForRow我每次遇到崩溃时都会崩溃细胞。究其原因即时通讯使用cellForRow是我需要的用户点击它后更改单元格的形象,但如果我使用dequeueReusableCell我得到多种变化(因为细胞总是重复使用)。cellForRow返回nil - swift 3

我在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 
} 
+2

这显然是给你为零,因为细胞从来没有在'indexPath'加入,您需要使用'dequeueReusableCell'和添加在你的问题重复使用的问题。 –

+0

您应该在'cellForRowAt'中使用'dequeueReusableCell',并在其他地方使用'cellForRow'。 – kennytm

回答

1

从数据源方法中tableView(:cellForRowAt:)因为第二个方法只是给你回,你以前给它的第一种方法的细胞则不能使用tableView.cellForRow(at: indexPath)

它的意思,如果你有一个索引路径取回从表视图中的单元格。你无法绕过表视图的视图 - 重用,你必须使用出列。

如果问题是你“获得多个变化(因为细胞总是重复使用)”你需要保证细胞正常重用准备,和/或它只是设置一次。

我不确定你的实现是什么,但是当你的视图控制器被调用时,用户点击了单元格(从按钮或手势识别器),你应该传递单元本身,因为如果你有单元格你可以调用tableview.indexPathForCell()并知道哪个indexPath被点击,所以你会知道什么数据来更新这个单元格。希望这可以帮助。

编辑:(单元格是'选择'的意义上,你跟踪,而不是单元格的selected属性,如果你想使用,它是所有不同的)。您还应跟踪当前选定的索引并在数据源方法中以不同方式格式化单元格,以防用户将所选单元格滚动到屏幕外并返回时应仍选中。

具有数据源的方法检查是否选择一个单元格,因为它也会让你只是胡乱重新加载,你认为可能有变化的任何细胞是很重要的。但是这不是很好的做法(但简单而美好!)更好的是,如果你有单元,你可以直接设置它的属性。

+0

问题是我不能更改最后一个单元格图像。让我们假设用户单击单元格A(图像更改),然后单击单元格B,单元格A应该获取默认图像,因为它不再选择。每当用户单击一个单元格时,我将indexPath保存在一个变量上,当他单击另一个单元格时,我只是使用该变量将单元格上的图像设置为原始状态,但这不起作用。 – Adrian

+0

你所描述的应该与此兼容。你所描述的听起来很好,我需要看代码。如果你想把所有其他的单元格返回到默认值,一种常用的方法是循环遍历可见单元格,比如'tableView.visibleCells {'中的单元格,并将所有内容设置为默认值,然后设置你想要的不同值。然后,您不需要跟踪之前选择了哪个单元格。 –

+1

确定 - 那么您只需重新载入上一行,并重新绘制它,确认selectedIndex不同,并使用默认图像。 或者它会,一旦你添加一些代码到'cellForRowAt'来更新单元格。如果直接将图像作为didSelect方法的一部分进行更新,那么您应该将其更新,更新您的selectedIndex,然后重新加载当前和之前(存在的位置) – Russell

2

回去使用dequeueReusableCell

didSelectRowAt变化,你要使用的图像,或在您的数据集中的地方设置一个值,并刷新该行

确保cellForRowAt方法使用已设置的更新图像或标志,并重新绘制单元格。

+0

其实我这样做,但问题是,我不能改变最后的细胞图像。让我们假设用户单击单元格A(图像更改),然后单击单元格B,单元格A应该获取默认图像,因为它不再选择。每当用户单击一个单元格时,我将indexPath保存在一个变量上,当他单击另一个单元格时,我只是使用该变量将单元格上的图像设置为原始状态,但这不起作用。 – Adrian