Пользовательская кнопка TableViewCell должна переключать активный статус и значок определенной строки, но она также меняет значок других не связанных строк

Мне нужно переключить состояние для объекта (активный / неактивный) в tableView который содержит пользовательские объекты: я хочу показать только активные объекты в этом tableView, поэтому, когда состояние объекта меняется на неактивное, оно исчезает из списка.

Приложение работает (создает новые пользовательские объекты, отображая их в tableView, просмотр и редактирование их содержимого - включая активный / неактивный статус - в detailView...); если это уместно, учтите, что в моем проекте используются базовые данные и что я использую его методы для заполнения tableView,

Мне также нужен индивидуальный дизайн для tableView ячейки, которые я уже реализовал (у меня есть подкласс UITableViewCell и пользовательские ячейки, отображающие желаемый контент), и это тоже, кажется, работает, но я впервые с пользовательскими ячейками, и я, должно быть, сделал что-то не так...

Когда я нажимаю активную-неактивную кнопку в ячейке, чтобы изменить статус пользовательского объекта (и заставить его исчезнуть из списка, потому что он стал неактивным), я фактически получаю то, что хочу для этого объекта (его статус изменяется, и объект исчезает из список).

Моя проблема в том, что я также вижу изображение UIButton (который показывает два разных значка, когда объект активен или неактивен) из нескольких других строк меняется на неактивный значок. Обычно изображение кнопки всех строк, кроме той, которую я только что нажал и которая уже исчезла, должно быть активной. Пожалуйста, учтите, что для этих других строк только значок является неправильным, фактическое состояние остается активным для каждой строки, к которой я не прикоснулся: если я остановлю приложение и снова его запущу, при запуске значки будут в порядке, и в tableView Я вижу только те объекты, которые все еще активны.

Я уверен, что моя проблема связана с `dequeueReusableCellWithIdentifier, но я не знаю, что делать, чтобы решить эту проблему.

Вот несколько моих методов:

// TableViewController

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as MyCustomTableViewCell

    self.configureCell(cell, atIndexPath: indexPath)

    return cell
}


func configureCell(cell: MyCustomTableViewCell, atIndexPath indexPath: NSIndexPath) {

    let aObject = self.fetchedResultsController.objectAtIndexPath(indexPath) as CustomObject

    cell.customLabel.text = aObject.name
    cell.detailLabel.text = aObject.anotherProperty
    //...

    cell.objectToMarkAsInactive = aObject
}


// MyCustomTableViewCell

//... IBOutlets

var objectToMarkAsInactive : CustomObject?

@IBAction func markObjectAsInactive(sender: AnyObject) {

    activeButton.selected = !activeButton.selected

    objectToMarkAsInactive?.active = !(objectToMarkAsInactive?.active as Bool)

    saveContext()
}


override func awakeFromNib() {
    super.awakeFromNib()

    // UIImage vars

    activeButton.setImage(activeImage, forState: UIControlState.Selected)
    activeButton.setImage(inactiveImage, forState: UIControlState.Normal)
    activeButton.setImage(highlightedImage, forState: UIControlState.Highlighted)
}

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

Понятно, что мое решение установить пользовательское свойство ячейки objectToMarkAsInactive = aObject in configureCell TableViewController не является правильным, так как ячейки используются повторно, но у меня нет других идей для достижения того, что я хочу, так как кнопка изменения состояния ячейки должна быть подключена как IBAction к MyCustomTableViewCell, а не к TableViewController.

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

Я должен прекратить использовать dequeueReusableCellWithIdentifier? Мне бы это не понравилось, потому что потенциально у меня могло бы быть значительное количество объектов, но если бы мне пришлось использовать нормальные ячейки, могу ли я иметь для них индивидуальный дизайн без deque? "Обычный" метод создания ячеек показывает только несколько опций для нормальных ячеек, а не пользовательских, в перечислении (UITableViewCellStyle.).

Заранее спасибо,

@ cdf1982

1 ответ

Решение

Вам не нужно прекращать использовать dequeueReusableCellWithIdentifier, Проблема заключается в том, что ячейки используются повторно, но если это просто изображение для кнопки, которое является неправильным, добавьте проверку, чтобы увидеть, какое изображение должно отображаться.

func configureCell(cell: MyCustomTableViewCell, atIndexPath indexPath: NSIndexPath) {

    let aObject = self.fetchedResultsController.objectAtIndexPath(indexPath) as CustomObject

    cell.customLabel.text = aObject.name
    cell.detailLabel.text = aObject.anotherProperty
    //...
    if aObject.isActive { // set button to active }
    else { // set button to inactive }

    cell.objectToMarkAsInactive = aObject
}
Другие вопросы по тегам