2017-03-07 117 views
0

我有一個TableView來顯示一堆電影。movies是Movie對象的數組。 movieIDs是電影ID的數組。 Ids只是字符串。Swift 3 UITableViewCell indexPath.row搞砸了

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 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) 
     } 

    } 

我在小區,這是movies[indexPath.row].movieIDmovieIDs所有的ID比較影片的ID。如果它返回true,我替換單元格內的按鈕的圖像。當我在if語句內部打印時,它實際上不會執行,但它仍然替換隨機單元格中的按鈕圖像。如果我上下滾動速度太快,幾乎所有單元格中的按鈕圖像都會被替換,當它僅用於更改id匹配的單元格時。

回答

2

的原因,這些細胞都塞因爲它們是可重用的單元。例如,如果您將單元格1設置爲圖像,那麼當您向下滾動並且單元格1離開屏幕並變爲單元格10(例如)時,它仍然會顯示圖像。

解決方法是,您必須通過檢查以前設置的圖像是否與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) 
} 
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 
}