How to show a message when collection view is empty

ios, swift

Solution

I make use of the `backgroundView` in an extension as such:

extension UICollectionView {

    func setEmptyMessage(_ message: String) {
        let messageLabel = UILabel(frame: CGRect(x: 0, y: 0, width: self.bounds.size.width, height: self.bounds.size.height))
        messageLabel.text = message
        messageLabel.textColor = .black
        messageLabel.numberOfLines = 0;
        messageLabel.textAlignment = .center;
        messageLabel.font = UIFont(name: "TrebuchetMS", size: 15)
        messageLabel.sizeToFit()

        self.backgroundView = messageLabel;
    }

    func restore() {
        self.backgroundView = nil
    }
}

and I use it as such:

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

    if (self.movies.count == 0) {
        self.collectionView.setEmptyMessage("Nothing to show :(")
    } else {
        self.collectionView.restore()
    }

    return self.movies.count
}

Problem

I`m trying to show a message only when my collection view is empty. Well, I try set return 1 when my if is true but when I have this, it only show one item in my collection view (even if I had more). And when I return this (code bellow) it shows all the items I have in my collection view but when I try to delete it, the last one is not "deletable", I mean, the last one stays there. How can I show this message only if I have no items in my collection view? ``` func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { if self.movies.count > 0 { self.favCollectionView.backgroundView = nil return self.movies.count } else { let rect = CGRect(x: 0, y: 0, width: self.favCollectionView.bounds.size.width, height: self.favCollectionView.bounds.size.height) let noDataLabel: UILabel = UILabel(frame: rect) noDataLabel.text = "No favorite movies yet." noDataLabel.textAlignment = .center noDataLabel.textColor = UIColor.gray noDataLabel.sizeToFit() self.favCollectionView.backgroundView = noDataLabel return 0 } } ``` Update I did it like this: ``` func numberOfSections(in collectionView: UICollectionView) -> Int { return 2 } func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { if section == 0 { return self.movies.count} else if section == 1 { if self.movies.count < 1 { return 1 } else { return 0 } } return 0 } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = favCollectionView.dequeueReusableCell(withReuseIdentifier: "FavCollectionCell", for: indexPath) as! FavoritesCollectionViewCell if indexPath.section == 0 { let movie = movies[indexPath.row] let imgStg: String = movie.posterURL! let imgURL: URL? = URL(string: imgStg) let imgSrc = ImageResource(downloadURL: imgURL!, cacheKey: imgStg) cell.favTitleLabel.text = movie.title cell.favPosterImageView.layer.cornerRadius = cell.favPosterImageView.frame.size.width/2 cell.favPosterImageView.clipsToBounds = true //image cache with KingFisher cell.favPosterImageView.kf.setImage(with: imgSrc) return cell } else { let rect = CGRect(x: 0, y: 0, width: self.favCollectionView.frame.width, height: self.favCollectionView.frame.height) let noDataLabel: UILabel = UILabel(frame: rect) noDataLabel.text = "No favorite movies yet." noDataLabel.textAlignment = .center noDataLabel.textColor = UIColor.gray noDataLabel.sizeToFit() let cell = UICollectionViewCell() cell.contentView.addSubview(noDataLabel) return cell } } ``` For @Lamar's solution, but the app crashed with error:

Original source