Swift 3 UITableViewCell indexPath.row搞砸了

时间:2017-03-07 03:52:48

标签: ios swift uitableview tableviewcell

我有一个TableView来显示一堆电影。movies是Movie对象的数组。 movieIDs是电影ID的数组。 Ids只是字符串。

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "movieCell", for: indexPath) as! MovieCell

        // editing the cell here.

        cell.movieNameLabel.text = movies[indexPath.row].movieName
        cell.movieYearLabel.text = movies[indexPath.row].year

        // source of all hell here.

        for id in movieIDs {

            if id == movies[indexPath.row].movieID {

                print(id + " is equal to " + movies[indexPath.row].movieID)
                cell.myButton.setImage(/*there is an image here*/), for: .normal)

            }

        }

cellForRowAt方法中的for循环:

for id in movieIDs {

        if id == movies[indexPath.row].movieID {

            print(id + " is equal to " + movies[indexPath.row].movieID)
            cell.myButton.setImage(//there is an image here), for: .normal)
        }

    }

我正在将movieIDs中的所有ID与单元格中电影的ID进行比较,即movies[indexPath.row].movieID。如果它返回true,我替换单元格内按钮的图像。当我在if语句中打印时,它实际上并没有执行,但它仍然替换随机单元格中的按钮图像。如果我上下滚动得太快,按钮的图像几乎在所有单元格中被替换,当它只是为了更换ids匹配的单元格时。

2 个答案:

答案 0 :(得分:2)

细胞被填塞的原因是因为它们是可重复使用的细胞。

因此,例如,如果您为单元格#1设置了图像,当您向下滚动并且单元格#1离开屏幕并变为单元格#10(例如)时,它仍然显示图像。 / p>

解决方案是您必须通过检查它是否与movieID不匹配来删除之前设置的图像,将图像设置为nil

您不必在此处执行for循环,而是使用contains作为数组。所以替换这段代码:

for id in movieIDs {

    if id == movies[indexPath.row].movieID {

        print(id + " is equal to " + movies[indexPath.row].movieID)
        cell.myButton.setImage(//there is an image here), for: .normal)
    }

}

用这个:

if movieIDs.contains(movies[indexPath.row].movieID) {
    cell.myButton.setImage(//there is an image here), for: .normal)
}
else{
    cell.myButton.setImage(nil)
}

答案 1 :(得分:0)

如果没有nil匹配,则必须设置id

var matched = false
for id in movieIDs {

    if id == movies[indexPath.row].movieID {

        print(id + " is equal to " + movies[indexPath.row].movieID)
        cell.myButton.setImage(//there is an image here), for: .normal)
        matched = true
    }

}

if !matched {
    cell.myButton.setImage(nil)
}

为了获得更好的解决方案,您应该创建一个函数来获取图像:

if let image = getMovieImageByID(movies[indexPath.row].movieID) {
    cell.myButton.setImage(image), for: .normal)
} else {
    cell.myButton.setImage(nil), for: .normal)
}

func getMovieImageByID(movieID: String) -> UIImage? {
    for id in movieIDs {
        if id == movieID {
            // return the image for the respective movieID
        }
    }

    return nil
}