Я разрабатываю приложение для iOS, в котором хочу перезагрузить информацию о UITableView
с другого контроллера. Для этого у меня есть ссылка на контроллер MainViewController
с UITableView
в другом контроллере с именем (AirlinesController
).
У меня проблема с перезагрузкой данных UITableView
первого контроллера, из-за чего они сильно портятся:
< Сильный > MainViewController
Каждая ячейка таблицы, которую вы видите, ведет к AirlinesController
:
Контролер авиакомпаний
Таким образом, после того, как пользователь нажимает кнопку «Применить», UITableView
из MainViewController
перезагружается с использованием mainView.reloadData()
. В этом примере я хотел бы видеть в MainViewController
, что ячейка с заголовком «Embraer» имеет зеленую метку с текстом «Завершено», а ячейка с заголовком «Airbus» имеет желтую метку с заголовком «Сотрудник», но это результат, который я получаю после перезагрузки таблицы:
Почему последняя ячейка таблицы изменила цвет одной из своих меток на желтый?
Это код, который я использую:
< Сильный > 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)
}
}
Как я могу это исправить?
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
}
}
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
Похожие вопросы
Новые вопросы
ios
iOS - мобильная операционная система, работающая на Apple iPhone, iPod touch и iPad. Используйте этот тег [ios] для вопросов, связанных с программированием на платформе iOS. Используйте связанные теги [target-c] и [swift] для проблем, характерных для этих языков программирования.
cell.accessoryType = .none
иcell.isUserInteractionEnabled = false
, как если бы она выполнила оба условияelse
. Есть ли способ сбросить повторное использование ячеек?