如何在集合视图为空时显示消息

我只是在我的集合视图为空时才尝试显示消息。 好吧,我尝试设置返回1当我的if是真的但是当我有这个时,它只显示我的集合视图中的一个项目(即使我有更多)。 当我返回此代码(下面的代码)时,它会显示我在集合视图中的所有项目,但是当我尝试删除它时,最后一个不是“可删除”,我的意思是,最后一个停留在那里。 只有在我的集合视图中没有项目时,才能显示此消息?

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 } } 

更新

我是这样做的:

 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  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 } } 

对于@ Lamar的解决方案,但应用程序因错误而崩溃: 在此处输入图像描述

我在扩展中使用了backgroundView

 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 } } 

我这样使用它:

 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 } 

“`

使用“集合视图”的backgroundView显示“无结果”消息。

我想说你的collectionView中有两个部分 ,其中一个用于显示实际数据,另一个用于没有任何数据。

假设我们在第0节填充数据。

numberOfRowsInSection你有类似的东西:

  if section == 0 { return movies.count} else if section == 1 { if movies.count < 1 { return 1 } else { return 0 } } return 0 

在你的cellForItemAt你做这样的事情:

  if indexPath.section == 0 { // let cell = ... // show your data into your cell return cell }else { // here you handle the case where there is no data, but the big thing is we are not dequeuing 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 } 

这是Swift4.0版本代码。 这里正在更新@Samman Bikram Thapa的回答。 为uicollection视图创建一个扩展名。

 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: "Avenir-Light", size: 18) messageLabel.sizeToFit() self.backgroundView = messageLabel; } func restore() { self.backgroundView = nil } } 

在您的VC中使用numberOfItemsInSection函数中的这个。

 func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { if (self. movies.count == 0) { self. favCollectionView.setEmptyMessage("No data found") } else { self. favCollectionView.restore() } return self. movies.count } 

你为什么不用:

open var backgroundView: UIView?

//将自动resize以跟踪集合视图的大小,并放置在所有单元格和补充视图后面

只要集合为空,您就可以显示它。 例:

 var collectionView: UICollectionView! var collectionData: [Any] { didSet { collectionView.backgroundView?.alpha = collectionData.count > 0 ? 1.0 : 0.0 } }