cellForRow返回nil - swift 3

时间:2017-01-27 16:15:40

标签: ios swift

我调用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
}

2 个答案:

答案 0 :(得分:3)

返回使用dequeueReusableCell

{ code: 0, // 0 is Ok, all other values is error data: [{...}, {...}, {...}, ...], // data objects message: "" // empty when ok or some error message in other cases } 中的

更改您要使用的图片,或在数据集的某处设置值,然后重新加载该行

确保import { Injectable } from '@angular/core'; import { Http, Response } from '@angular/http'; import { Observable } from 'rxjs/Observable'; interface IApiResponse<T> { code: number; data: Array<T>; message: string; } @Injectable() export class ApiService { constructor( private http: Http ) { } apiGet<T>(url: string): Observable<Array<T>> { return this.http.get(url) .map((res: Response) => res.json()) //.map((api: IApiResponse<T>) => api.code === 0 ? api.data : Observable.throw(api.message)) .mergeMap((api: IApiResponse<T>) => api.code === 0 ? api.data : Observable.throw(api.message)) .catch(err => Observable.throw(err)); } } 方法使用您设置的更新图像或标记,然后重绘单元格。

答案 1 :(得分:1)

在数据源方法tableView(:cellForRowAt:)中,您无法使用tableView.cellForRow(at: indexPath),因为第二种方法会返回您先前在其中提供的单元格第一种方法。

如果您有索引路径,它意味着从表视图中返回一个单元格。你无法绕过表视图的视图重用,你必须使用dequeue。

如果您遇到问题&#34;进行多项更改(因为该单元格总是被重复使用)&#34;您需要确保单元格已准备好重复使用,和/或它只设置一次。

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

编辑:(在您跟踪的意义上选择了单元格,而不是单元格的selected属性,如果您想使用它的全部不同)。您还应该跟踪当前选定的索引并在数据源方法中以不同方式格式化单元格,以防用户在屏幕外滚动选定的单元格,然后仍应选择它。

使用数据源方法检查是否选择了单元格非常重要,因为它还可以让您不加选择地重新加载您认为可能有更改的任何单元格。但是,如果您拥有可以直接设置其属性的单元格,那么这不是很好的练习(但简单而精细!)更好。