Пользовательская кнопка 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
}