问题
I've been working on a project of using two UICollectionView
's I have on that is the MainViewController with full screen cells that scroll horizontally and one that sits on that full screen cell and scrolls vertically. I have a functionality that adds as well as deletes cells. When a user taps and one of the pages of the MainViewController is deleted using the code below the memory that grew as cells were added is still being retained. Is there something Im doing wrong. All of my delegates are weak references and none of my cells have self referencing closures. Am I doing something wrong thank you for you help
Here is the full project
https://github.com/TheRedCamaro30/Leaky-Nested-UICollectionViews
Add or Remove Cell Delegate
func addCell(){
self.mainCollectionView.performBatchUpdates({
guard let last = arr.last else{
return
}
arr.append(last + 1)
let lastIndex = IndexPath(item: last, section: 0)
self.mainCollectionView.insertItems(at: [lastIndex])
}) { (completed) in
print("Batch updates completed, performed successfully: \(completed)")
}
}
func removeCell() {
self.mainCollectionView.performBatchUpdates({
arr.popLast()
self.mainCollectionView.deleteItems(at: [IndexPath(item: arr.count - 1, section: 0)])
}) { (competed) in
print("Perform batch updates completed")
}
}
Full Sized Cell Cell Population
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: FullPageCell.reuseIdentifier, for: indexPath) as? FullPageCell else{
assertionFailure("Fatal Error FullPageCell not dequed")
return UICollectionViewCell()
}
cell.backgroundColor = UIColor.green
cell.cellTappedDelegate = self
return cell
}
func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
if let cell = cell as? FullPageCell{
cell.setUpCollectionView()
}
}
SubCollectionView sitting on Full Page Cell Population
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: SmallCell.reuseIdentifier, for: indexPath) as? SmallCell else{
assertionFailure("Fatal Error FullPageCell not dequed")
return UICollectionViewCell()
}
cell.backgroundColor = UIColor.yellow
cell.imageView.image = self.image
return cell
}
SetUpCollectionView
func setUpCollectionView(){
let view = self.contentView
let layout = UICollectionViewFlowLayout()
layout.minimumLineSpacing = 1
layout.minimumInteritemSpacing = 1
layout.scrollDirection = .vertical
layout.itemSize = CGSize(width: (view.bounds.width - 2)/3, height: (view.bounds.width - 2)/3)
collectionView = UICollectionView(frame:view.bounds, collectionViewLayout: layout)
collectionView.dataSource = self
collectionView.delegate = self
collectionView.register(SmallCell.self, forCellWithReuseIdentifier: SmallCell.reuseIdentifier)
collectionView.backgroundColor = UIColor.white
self.collectionView.isPagingEnabled = true
view.addSubview(collectionView)
collectionView.translatesAutoresizingMaskIntoConstraints = false
collectionView.topAnchor.constraint(equalTo: view.topAnchor, constant: 0).isActive = true
collectionView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0).isActive = true
collectionView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0).isActive = true
collectionView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true
}
回答1:
To insert, delete, or move a single section or item, you must follow these steps:
Update the data in your data source object.
Call the appropriate method of the collection view to insert or delete the section or item.
Just replace removeCell
method with below code.
func removeCell() {
self.mainCollectionView.performBatchUpdates({
arr.popLast()
self.mainCollectionView.deleteItems(at: [IndexPath(item: arr.count - 1, section: 0)])
}) { (competed) in
print("Perform batch updates completed")
//If it is not worked then reload collectionview
//self.mainCollectionView.reloadData()
}
}
Please refer below references.
Inserting, Deleting, and Moving Sections and Items
Collection View Programming Guide for iOS
来源:https://stackoverflow.com/questions/55349341/memory-is-not-released-during-perform-batch-updates-in-collectionview