2017-09-03 81 views
0

我有一個協議內的函數,它將TableViewcell作爲參數。我怎樣才能阻止我的tableview單元格重新使用它裏面的按鈕?

protocol GoingButtonDelegate { 
    func goingButtonPressed(cell: TableViewCell) 
} 

class TableViewCell: UITableViewCell { 
    // Outlets 
    @IBOutlet weak var goingButton: UIButton! 

    var delegate: GoingButtonDelegate? 

    @IBAction func goingButtonTapped(_ sender: Any) { 
     delegate?.goingButtonPressed(cell: self) 
    } 

然後我去到我的ViewController和實現委託和它的功能,這是挖掘何時改變按鈕的圖像。 「正在選擇」是綠色圖像,「正在選擇」是紅色圖像。

這一切都很好,當點擊一個單元格的按鈕從紅色到綠色,反之亦然。但是,當單元格被重用時,單元格的按鈕狀態會持續存在並被重用於進入視圖的新行。有什麼辦法可以阻止這種情況發生?

extension ViewController: GoingButtonDelegate { 
    func goingButtonPressed(cell: TableViewCell) { 
     cell.goingButton.isSelected = !cell.goingButton.isSelected 

     if cell.goingButton.isSelected == true { 
      cell.goingButton.setImage(UIImage(named: "goingSelected"), for: UIControlState.selected) 
     } else if cell.goingButton.isSelected == false { 
      cell.goingButton.setImage(UIImage(named: "goingDeselected"), for: UIControlState.normal) 
     } 
    } 
} 
+1

的可能的複製[如何防止從的UITableView重用定製單元斯威夫特(https://stackoverflow.com/問題/ 37938809/how-to-prevent-uitableview-from-reuse-custom-cells-swift) – 2017-09-03 18:32:14

+0

您不想避免重複使用單元格。這不是合適的解決方案。 – rmaddy

回答

0

有可能

只是更換

let cell = tableView.dequeueReusableCell(withIdentifier: identifier, 
    for: indexPath) 

let cell= Bundle.main.loadNibNamed(identifier, owner: self, options: nil)?[0] 

但我認爲你需要改變你的應用程序邏輯。

Images你的類

class TableViewCell: UITableViewCell { 
    override func awakeFromNib() { 
    super.awakeFromNib() 
    self.goingButton.setImage(UIImage(named: "goingDeselected"), for:.normal) 
    self.goingButton.setImage(UIImage(named: "goingSelected"), for:.selected) 
    } 
} 

和方法goingButtonPressed(cell: TableViewCell)變化cell到對象 和剛剛成立Bool型true或false

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    ... 
    cell.goingButton.isSelected = object.isSelected 
    ... 
} 
+1

你不想這樣做。不要避免重複使用單元格。 – rmaddy

+0

@rmaddy我已經提供了答案,更好的將是改變邏輯 –

0

您需要存儲選定行內在一系列索引路徑中,在這之前我認爲你應該做一些增強......或者很多!

單元本身應該處理它的按鈕,控制器應該跟蹤所有的單元狀態。 這兩個屬性添加到您的

class TableViewCell: UITableViewCell { 
    var indexPath:IndexPath? 
    var isSelected : Bool = false { 
     didSet{ 
      if isSelected { 
       cell.goingButton.setImage(UIImage(named: "goingSelected"), for: UIControlState.normal) 
      } else { 
       cell.goingButton.setImage(UIImage(named: "goingDeselected"), for: UIControlState.normal) 
      } 
     } 
    } 
    // Outlets 
    @IBOutlet weak var goingButton: UIButton! 

    var delegate: GoingButtonDelegate? 

    @IBAction func goingButtonTapped(_ sender: Any) { 
     self.isSelected = !self.isSelected 
     delegate?.goingButtonPressed(cell: self) 
    } 
    .. 
    ... 
} 

,並存儲在您的視圖控制器選中的單元格來跟蹤每一個細胞的狀態。

extension ViewController: GoingButtonDelegate { 
    var selectedCells = NSMutableArray() 
    func goingButtonPressed(cell: TableViewCell) { 
     if cell.isSelected { 
      selectedCells.add(cell.indexPath) 
     } else { 
      selectedCells.remove(cell.indexPath) 
     } 
    } 
} 

,並在你的「單元格爲行」的方法只需添加一個小的變化

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "yourCellIdentifier") as! TableViewCell 
    cell.indexPath = indexPath 
    cell.isSelected = selectedCells.contains(indexPath) 
    .. 
    ... 
    return cell 
} 
相關問題