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
очистить камеру.
Из соображений производительности следует сбрасывать только те атрибуты ячейки, которые не связаны с содержимым, например альфа, редактирование и состояние выбора. Делегат табличного представления в tableView(_:cellForRowAt:) должен всегда сбрасывать все содержимое при повторном использовании ячейки.
Когда пришло время очистить камеру в prepareForReuse
Я обнаружил методом проб и ошибок, что лучший способ очистить текст ярлыка - это использовать label.text = ""
вместо label.text = nil
и как видно из вышесказанного Apple не хочет prepareToReuse
использоваться для более чем легкой очистки. Тем не менее, я читал другие посты на SO, что лучше очистить и удалить AVPlayerLayer, установив его nil
и удалив его из супер слоя в prepareForReuse
,
У меня 2 вопроса
- Если не внутри
prepareForReuse
тогда где я могу сброситьcurrentTime
а такжеdata
свойства кnil
иimageView's image
вnil
? Это при условии, что приложение было отправлено в фоновом режиме иcurrentTime
свойство было установлено в какое-то значение. - Если я не могу установить текст метки на ноль в
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 перед настройкой содержимого.