Swift iOS - Как очистить свойства класса ячейки и изображение ImageView (также внутри ячейки)?

Я использую CollectionViewCells и TableViewCells внутри моего приложения, но для этого примера я просто собираюсь перечислить информацию TableViewCell, потому что они оба используют prepareForReuse,

Внутри клетки у меня есть:

@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var thumbnailImageView: UIImageView!
@IBOutlet weak var backgroundViewForPlayerLayer: UIView!

var data: MyData?
var currentTime: CMTime? // used to keep track of the current play time when the app is sent to the background

var playerItem: AVPlayerItem?
var player: AVPlayer?
var playerLayer: AVPlayerLayer?

Когда я получаю данные таблицы для своей ячейки, я передаю данные в ячейку в cellForRowAtIndexPath, Я передаю это data свойство внутри ячейки, и я устанавливаю уменьшенное изображение ячейки и название выхода в awakeFromNib(), Я понимаю, как клетки прокручиваются со сцены, а затем используются повторно, поэтому я использую prepareForReuse очистить камеру.

Здесь Apple говорит:

Из соображений производительности следует сбрасывать только те атрибуты ячейки, которые не связаны с содержимым, например альфа, редактирование и состояние выбора. Делегат табличного представления в tableView(_:cellForRowAt:) должен всегда сбрасывать все содержимое при повторном использовании ячейки.

Когда пришло время очистить камеру в prepareForReuse Я обнаружил методом проб и ошибок, что лучший способ очистить текст ярлыка - это использовать label.text = "" вместо label.text = nil и как видно из вышесказанного Apple не хочет prepareToReuse использоваться для более чем легкой очистки. Тем не менее, я читал другие посты на SO, что лучше очистить и удалить AVPlayerLayer, установив его nil и удалив его из супер слоя в prepareForReuse,

У меня 2 вопроса

  1. Если не внутри prepareForReuse тогда где я могу сбросить currentTime а также data свойства к nil и imageView's image в nil? Это при условии, что приложение было отправлено в фоновом режиме и currentTime свойство было установлено в какое-то значение.
  2. Если я не могу установить текст метки на ноль в prepareForReuse тогда почему лучше всего установить AVPlayerLayer на ноль в prepareForReuse?

TableVIewCell:

class MyCell: UITableViewCell{

@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var thumbnailImageView: UIImageView!

var data: MyData?
var currentTime: CMTime?
var playerItem: AVPlayerItem?
var player: AVPlayer?
var playerLayer: AVPlayerLayer?

override func awakeFromNib() {
        super.awakeFromNib()

        NotificationCenter.default.addObserver(self, selector: #selector(appHasEnteredBackground), name: Notification.Name.UIApplicationWillResignActive, object: nil)

        titleLabel.text = data.title!
        thumbnailImageView.image = data.convertedUrlToImage() // url was converted to an image

        configureAVPlayer() //AVPlayer is configured
}


override func prepareForReuse() {
        super.prepareForReuse()

        titleLabel.text = ""

        player?.pause()
        playerLayer?.player = nil
        playerLayer?.removeFromSuperlayer()

        // should I reset these 3 here or somewhere else?
        data = nil
        currentTime = nil
        thumbnailImageView.image = nil
}

@objc func appHasEnteredBackground() {

        currentTime = player.currentTime()
        // pause the player...
}

}

cellForRowAtIndexPath:

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

        let data = tableData[indexPath.row]

        cell.data = data

        return cell
}

1 ответ

Решение

Я нашел ответ здесь: prepareForReuse очистить

Кажется, лучший способ очистить ячейку - это сделать это в cellForRowAtIndexPath перед настройкой содержимого.

Другие вопросы по тегам