#ios #swift
#iOS #swift
Вопрос:
Я извлекаю totalRaters и totalRatings из серверной части. Я делю последнее на первое, чтобы определить, сколько звезд я должен показать. Это всегда будет число от 0 до 5 включительно.
Мой код оценки звезд в подклассе UITableViewCell является:
fileprivate let starStack : UIStackView = {
let stackView = UIStackView()
stackView.axis = .horizontal
stackView.alignment = .fill
stackView.distribution = .fillEqually
stackView.spacing = 4
return stackView
}()
func setupStar() {
//... code to add a label
backgroundView.addSubview(starStack)
starStack.translatesAutoresizingMaskIntoConstraints = false
starStack.topAnchor.constraint(equalTo: label.bottomAnchor, constant: 8).isActive = true
starStack.leadingAnchor.constraint(equalTo: backgroundView.leadingAnchor, constant: 8).isActive = true
starStack.bottomAnchor.constraint(equalTo: backgroundView.bottomAnchor, constant: -8).isActive = true
starStack.heightAnchor.constraint(equalToConstant: 34).isActive = true
}
func setValues(totalRatings Int, totalRaters Int) {
let ratings = totalRatings / totalRaters
if ratings > 0 {
for index in 0...ratings - 1 {
arrayStar[index].image = UIImage(named: "icon_starred")
}
}
}
Проблема в том, что всякий раз, когда я прокручиваю вниз (т. Е. Ячейка исчезает под портом просмотра), а затем делаю резервную копию, звездочки продолжают складываться, пока не будут заполнены все 5 звездочек. Это происходит для всех ячеек табличного представления. Я не уверен, что я делаю не так. Я добавил изображения, чтобы указать на проблему ниже. (Они были загружены в обратном порядке)
Ответ №1:
Ячейки табличного представления могут использоваться повторно при прокрутке таблицы вверх и вниз. Вы устанавливаете изображения в массив, но никогда не очищаете их, поэтому при повторном использовании ячейки в ней сохранится все, что было там для предыдущего использования.
Вы должны добавить метод prepareForReuse в свой класс ячеек table view и очистить массив изображений. Что-то вроде:
override func prepareForReuse() {
super.prepareForReuse()
arrayStar = [UIImage](count: 5, repeatedValue: UIImage(named: "icon_not_starred"))
}