Проблема с Swift TableViewCell: изменить цвет фона для выбранной строки

У меня странная проблема с моим tableView. У меня есть список звуковых дорожек и переход к аудиоплееру для воспроизведения выбранной дорожки в определенной строке. Все работает нормально!

Я хотел изменить цвет фона для выбранной строки в таблице, чтобы, как только пользователь воспроизвел аудио и вернулся к списку дорожек (мой контроллер табличного представления), он мог видеть, какие ранее выбранные строки.

Но когда я запускаю, он меняет цвет не только для строки по выбранному мной индексному пути, но и для элемента по индексному пути + 10. Если я выбираю первую строку, он меняет цвет строки по индексу: 0, 10, 20, 30...

Чтобы изменить цвет выбранной ячейки, я сделал следующее:

// MARK: - Navigation
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    self.performSegueWithIdentifier("audioPlayer", sender: tableView)

    var selectedCell:UITableViewCell = tableView.cellForRowAtIndexPath(indexPath) as CustomTableViewCell
    selectedCell.contentView.backgroundColor = UIColor.greenColor()
    selectedCell.backgroundColor = UIColor.blueColor()

Пожалуйста, найдите скриншот моей проблемы, я выбрал только три строки: 1, 3, 5, но я выбрал 1,3,5,11,13,15,21,23 и так далее... : https://www.dropbox.com/s/bhymu6q05l7tex7/problemaCelleColore.PNG?dl=0

Для получения дополнительной информации - если можете помочь - вот мой класс Custom Table View:

    import UIKit

    class CustomTableViewCell: UITableViewCell {

@IBOutlet weak var artista: UILabel!

@IBOutlet weak var brano: UILabel!

var ascoltato = false

@IBOutlet weak var labelRiproduciAscoltato: UILabel!

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
}

override func setSelected(selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}

func setCell(artista: String, brano: String){
    self.artista.text = artista
    self.brano.text = brano
}

   }  // END MY CUSTOM TABLE VIEW CELL

Вот метод cellForRowAtIndexPath в моем TableViewController:

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = self.tableView.dequeueReusableCellWithIdentifier("tableCell", forIndexPath: indexPath) as CustomTableViewCell

    var tracks : Brani  //Brani is my custom Object for handle my tracks

    cell.setCell(tracks.title!, brano: tracks.author!)


    return cell

}

У меня iPad Air с iOS 7.1.

Заранее благодарю за любые предложения или советы, связанные с моей проблемой.


person Fustav    schedule 23.02.2015    source источник


Ответы (1)


Вероятно, это связано с тем, что UITableViewCells перерабатываются. Это означает, что ранее выбранный tableViewCell повторно используется ячейками с более низкими индексами. Это ожидаемое поведение UITableView, и оно имеет смысл, поскольку позволяет экономить память. Чтобы решить эту проблему, вам нужно, чтобы ваш источник данных отслеживал, какая ячейка выбрана, и соответствующим образом обновлял цвет фона ячейки.

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
self.performSegueWithIdentifier("audioPlayer", sender: tableView)
//datasource is updated with selected state
//cell is updated with color change
}

Затем в вашем методе cellForRowAtIndexPath:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = self.tableView.dequeueReusableCellWithIdentifier("tableCell", forIndexPath: indexPath) as CustomTableViewCell

    var tracks : Brani  //Brani is my custom Object for handle my tracks

    cell.setCell(tracks.title!, brano: tracks.author!)
    //update cell style here as well (by checking the datasource for selected or not). 

    return cell
}
person daltoniam    schedule 23.02.2015
comment
Спасибо, Далтон, за ваш ответ и извините за мой глупый вопрос, но: в моем случае моим источником данных будет мой CustomTableViewCell? - person Fustav; 26.02.2015