Swift 3 UITableViewCell indexPath.row 搞砸了
Swift 3 UITableViewCell indexPath.row messing up
我有一个 TableView 来显示一堆电影。movies
是 Movie 对象的数组。 movieIDs
是电影 ID 数组。 ID 只是字符串。
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
。如果 returns 为真,我将替换单元格内按钮的图像。当我在 if 语句中打印时,它实际上并没有执行,但它仍然会替换随机单元格中的按钮图像。如果我上下滚动得太快,按钮的图像会在几乎所有单元格中被替换,而它只是为了改变 ID 匹配的单元格。
如果没有 id
匹配,您必须设置 nil
:
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
}
细胞被塞满的原因是因为它们是可重复使用的细胞。
因此,例如,如果您为单元格 #1 设置了图像,当您向下滚动并且该单元格 #1 离开屏幕并成为单元格 #10(例如)时,它仍然显示图像.
解决方案是您必须删除之前设置的图像,方法是检查它是否与 movieID
不匹配,将图像设置为 nil
。
您不必在此处执行 for 循环,而是使用 contains
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)
}
}
有了这个:
if movieIDs.contains(movies[indexPath.row].movieID) {
cell.myButton.setImage(//there is an image here), for: .normal)
}
else{
cell.myButton.setImage(nil)
}
我有一个 TableView 来显示一堆电影。movies
是 Movie 对象的数组。 movieIDs
是电影 ID 数组。 ID 只是字符串。
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
。如果 returns 为真,我将替换单元格内按钮的图像。当我在 if 语句中打印时,它实际上并没有执行,但它仍然会替换随机单元格中的按钮图像。如果我上下滚动得太快,按钮的图像会在几乎所有单元格中被替换,而它只是为了改变 ID 匹配的单元格。
如果没有 id
匹配,您必须设置 nil
:
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
}
细胞被塞满的原因是因为它们是可重复使用的细胞。
因此,例如,如果您为单元格 #1 设置了图像,当您向下滚动并且该单元格 #1 离开屏幕并成为单元格 #10(例如)时,它仍然显示图像.
解决方案是您必须删除之前设置的图像,方法是检查它是否与 movieID
不匹配,将图像设置为 nil
。
您不必在此处执行 for 循环,而是使用 contains
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)
}
}
有了这个:
if movieIDs.contains(movies[indexPath.row].movieID) {
cell.myButton.setImage(//there is an image here), for: .normal)
}
else{
cell.myButton.setImage(nil)
}