Я разрабатываю приложение для iOS, в котором хочу перезагрузить информацию о UITableView с другого контроллера. Для этого у меня есть ссылка на контроллер MainViewController с UITableView в другом контроллере с именем (AirlinesController).

У меня проблема с перезагрузкой данных UITableView первого контроллера, из-за чего они сильно портятся:

< Сильный > MainViewController

enter image description here

Каждая ячейка таблицы, которую вы видите, ведет к AirlinesController:

Контролер авиакомпаний

enter image description here

Таким образом, после того, как пользователь нажимает кнопку «Применить», UITableView из MainViewController перезагружается с использованием mainView.reloadData(). В этом примере я хотел бы видеть в MainViewController, что ячейка с заголовком «Embraer» имеет зеленую метку с текстом «Завершено», а ячейка с заголовком «Airbus» имеет желтую метку с заголовком «Сотрудник», но это результат, который я получаю после перезагрузки таблицы:

enter image description here

Почему последняя ячейка таблицы изменила цвет одной из своих меток на желтый?

Это код, который я использую:

< Сильный > MainViewController

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "itemCell", for: indexPath) as! CellController
    
    let items = self.gameView.data!.levels
    
    cell.model.text = items[indexPath.row].name
    
    if items[indexPath.row].id < self.gameView.game!.level.id {
        cell.cost.text = "Complete"
        cell.cost.textColor = UIColor.systemGreen
        cell.accessoryType = .none
        cell.isUserInteractionEnabled = false
    } else if items[indexPath.row].id == self.gameView.game!.level.id {
        cell.cost.text = "Employee"
        cell.cost.textColor = UIColor.systemYellow
        cell.accessoryType = .none
        cell.isUserInteractionEnabled = false
    } else {
        cell.cost.text = "\(items[indexPath.row].XP) XP"
    }

    return cell
}

Контролер авиакомпаний

@IBAction func apply(_ sender: Any) {
    if (mainView.game.XP >= level.XP) {
        let new_salary = Int(Float(mainView.game.salary) * level.salaryMultiplier)
        let new_XP = Int(Float(mainView.game.XPSalary) * level.XPMultiplier)
        mainView.game.salary = new_salary
        mainView.game.XPSalary = new_XP
        mainView.salaryLabel.text = "\(new_salary) $"
        mainView.XPLabel.text = "\(new_XP) XP"
        
        mainView.workingFor.text = "Currently working for \(level.name)"
        
        mainView.game.level = Level(id: level.id, name: level.name, XP: 0, XPMultiplier: 1, salaryMultiplier: 1, aircrafts: [Aircraft]())
        
        mainView.saveGame()
        
        DispatchQueue.main.async {
            self.mainView.levelItems.reloadData()

            self.navigationController?.popViewController(animated: true)
        }
    } else {
        let alert = UIAlertController(title: "Error", message: "Not enough experience to apply!", preferredStyle: UIAlertController.Style.alert)
        alert.addAction(UIAlertAction(title: "OK", style: UIAlertAction.Style.cancel, handler: nil))

        self.present(alert, animated: true)
    }
}

Как я могу это исправить?

1
Javi Albors 9 Янв 2022 в 14:00

2 ответа

Лучший ответ

Это связано с повторным использованием ячеек.

Установите цвет по умолчанию в другом условии.

} else {
  cell.cost.textColor = UIColor.gray
  cell.cost.text = "\(items[indexPath.row].XP) XP"
}

Другой способ: вы можете установить свойство стиля по умолчанию внутри метода prepareForReuse UITableViewCell.

class TableViewCell: UITableViewCell {
    override func prepareForReuse() {
        super.prepareForReuse()
        // Set default cell style
    }
}
1
Raja Kishan 9 Янв 2022 в 14:34
Я пробовал это, но если вы заметили на последнем снимке экрана, последняя ячейка также имеет cell.accessoryType = .none и cell.isUserInteractionEnabled = false, как если бы она выполнила оба условия else. Есть ли способ сбросить повторное использование ячеек?
 – 
Javi Albors
9 Янв 2022 в 14:29
Я добавил еще один способ. не могли бы вы проверить это?
 – 
Raja Kishan
9 Янв 2022 в 14:34
Это исправлено, пришлось добавить стили ячеек по умолчанию, как вы упомянули. Спасибо!
 – 
Javi Albors
9 Янв 2022 в 14:55

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "itemCell", for: indexPath) as! CellController

cell.cost.textColor = ...your default text color....

...
return cell 
0
ouflak 9 Янв 2022 в 17:57