UICollection查看reloadData()无法正常工作

时间:2018-01-31 10:30:38

标签: ios swift xcode image collectionview

我遇到的问题是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

那么,每当视图再次出现时,如何重新加载集合视图,以便在第一次出现视图时不会重复使用最初加载的单元格?

3 个答案:

答案 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");