Как перестать повторять изображения в ячейке TableView - PullRequest
0 голосов
/ 14 февраля 2019

Я программно создал ImageView в методе cellForRowAt и добавил также в ячейку:

let imageName = "Default.png"
let image = UIImage(named: imageName)
let imageView = UIImageView(image: image!)
imageView.frame = CGRect(x: 29, y: 17, width: 14, height: 13)
cell.addSubview(imageView)

Работает, нечего ворчать.Теперь я хочу показать это изображение, только если indexpath.row равно 2, поэтому я добавил простое выражение if:

if indexPath.row == 2 {
    let imageName = "Default.png"
    let image = UIImage(named: imageName)
    let imageView = UIImageView(image: image!)
    imageView.frame = CGRect(x: 29, y: 17, width: 14, height: 13)
    cell.addSubview(imageView)
}

Это работает.Но когда я прокручиваю вниз, у некоторых ячеек тоже есть изображение.Я подозревал, что в cellForRowAt работает что-то не так, поэтому я добавил в UITableViewCell метод prepareForReuse, чтобы скрыть каждый imageView, и только если if-выражение истинно, то hide будет удален:

override func prepareForReuse() {
    super.prepareForReuse()
    self.imageView!.isHidden = true
}

if indexPath.row == 2 {
    let imageName = "Default.png"
    let image = UIImage(named: imageName)
    let imageView = UIImageView(image: image!)
    imageView.frame = CGRect(x: 29, y: 17, width: 14, height: 13)
    imageView.isHidden = false
    cell.addSubview(imageView)
}

К сожалению, это не работает, и я понятия не имею, что я мог бы улучшить.

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

В cellForRowAt добавьте остальную часть с пустым изображением для решения этой проблемы.

if indexPath.row == 2 {
  let imageName = "Default.png"
  let image = UIImage(named: imageName)
  let imageView = UIImageView(image: image!)
  imageView.frame = CGRect(x: 29, y: 17, width: 14, height: 13)
  cell.addSubview(imageView)
} else { // ## Add this else methode.
  let imageView = UIImageView()
  imageView.frame = CGRect(x: 29, y: 17, width: 14, height: 13)
  cell.addSubview(imageView)
}
0 голосов
/ 14 февраля 2019

Привет, проблема с вашим кодом в том, что при повторном использовании ячейки imageView по-прежнему находится в иерархии, поэтому в prepareForReuse удалите подпредставления, имеющие тип представления изображения, просто потому, что в ячейке уже было изображение по умолчанию, поэтому создайте новый класс imageView.и удалить этот конкретный тип, я добавляю код для него, надеюсь, это помогло:).

 class CustomImageView : UIImageView { //CustomImageView


}
func removeCustomImageViewIfNeeded() {

     self.subviews.forEach { (subView) in
        if subView is CustomImageView {
            subView.removeFromSuperview()
        }
    }
}

override func prepareForReuse() {
    super.prepareForReuse()
    removeCustomImageViewIfNeeded()
}

if indexPath.row == 2 {
let imageName = "Default.png"
let image = UIImage(named: imageName)
let imageView = CustomImageView(image: image!)
imageView.frame = CGRect(x: 29, y: 17, width: 14, height: 13)
imageView.isHidden = false
cell.addSubview(imageView)

}else {
removeCustomImageViewIfNeeded()
 }
0 голосов
/ 14 февраля 2019

prepareForReuse в подклассе вашей ячейки ссылается на свойство подкласса imageView и устанавливает его как скрытое.Однако в своем выражении if вы создаете новый вид изображения и добавляете его в иерархию ячейки.Это плохая идея, так как она никогда не будет удалена и будет добавляться все больше и больше по мере прокрутки.

Вместо этого укажите ссылку на изображение ячейки:

if indexPath.row == 2 {
    let imageName = "Default.png"
    let image = UIImage(named: imageName)
    cell.imageView?.image = image
    cell.imageView?.isHidden = false
}
...