我遇到的问题是reloadData()无法用于我的集合视图。我有三个集合视图,我已经使用此代码尝试每次打开视图时重新加载数据。
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.newArrivalsCollectionView.reloadData()
self.recommendedTitleCollectionView.reloadData()
self.popularTitlesCollectionVIew.reloadData()
}
问题是,首先,集合视图显示正确数量的单元格和图像(它在单元格内部有一个UIImage)。但是,当我按下按钮返回带有这些集合视图的视图时。它显然重用细胞并创造更多相同的细胞。我试图在创建这些单元格的集合视图函数中重新加载数据,但是它会产生错误。
编辑:
我已将视图控制器设置为数据源&在viewDidLoad()方法下委派所有3个视图控制器。此外,单元格是交互式的,触摸时它们应该做某事(即转到另一个视图),因此它不应该只是隐藏不需要的重用单元格,而是完全删除它们。
我也意识到每次重新打开视图时,都会向当前的单元格数添加相同数量的单元格。例如,如果最初,集合视图有2个不同的单元格,它将重新创建这2个单元格,现在将有4个相同的2类单元格的单元格。如果我再次这样做,将有6个相同的2种细胞的细胞。我认为这是我的一系列书籍,所以我尝试在viewDidAppear()方法中将其设置为空,但是,它仍然不起作用。
其他以下代码:
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
if collectionView == newArrivalsCollectionView {
return bookNewArrivalDataBase.count
}
else if collectionView == popularTitlesCollectionVIew
{
return bookPopularDatabase.count
}
else {
return bookRecommendedDatabase.count
}
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
//if it is a new arrival
if collectionView == newArrivalsCollectionView{
let newArrivalsCell = collectionView.dequeueReusableCell(withReuseIdentifier: "newArrivalsCell", for: indexPath) as! bookNewArrivalsCollectionViewCell
//sets the book that is being displayed
let bookCell = bookNewArrivalDataBase[indexPath.row]
// set the photo of the book that the new arrival cell is at
newArrivalsCell.setBookImage(bookCell)
return newArrivalsCell
}
else if collectionView == popularTitlesCollectionVIew {
let popularTitlesCell = collectionView.dequeueReusableCell(withReuseIdentifier: "popularTitlesCell", for: indexPath) as! bookPopularTitlesCollectionViewCell
//sets the book that is being displayed
let bookCell = bookPopularDatabase[indexPath.row]
// set the photo of the book that the new arrival cell is at
popularTitlesCell.setBookImage(bookCell)
return popularTitlesCell
}
else {
//create recommended title cell
let recommendedTitlesCell = collectionView.dequeueReusableCell(withReuseIdentifier: "recommendedTitlesCell", for: indexPath) as! bookRecommendedTitlesCollectionViewCell
let bookCell = bookRecommendedDatabase[indexPath.row]
// set the photo of the book
recommendedTitlesCell.setBookImage(bookCell)
return recommendedTitlesCell
}
} // end of cellforitemat
那么,每当视图再次出现时,如何重新加载集合视图,以便在第一次出现视图时不会重复使用最初加载的单元格?
答案 0 :(得分:0)
问题似乎与集合视图的委托方法有关:
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return number
}
func register(AnyClass?, forCellWithReuseIdentifier: String)
func cellForItem(at: IndexPath)
修复方法将解决问题,否则尝试在您的单元格类中使用prepareForReuse()方法并将值设置为nil of imageview图像.ex:
override func prepareForReuse() {
super.prepareForReuse()
imageview.image = nil
}
答案 1 :(得分:0)
我解决了自己的问题,因为它位于数组数据库本身,而不是集合视图无法重新加载数据。显然,我每次都必须重置数据库。
关键学习点是
类似的集合视图单元格并不一定意味着它复制了以前的单元格。
答案 2 :(得分:-1)
您必须重新加载数据
ShowToolTip("Hello World");