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

时间:2017-05-04 02:43:37

标签: ios swift

我只是在我的收藏视图为空时尝试显示一条消息。好吧,我尝试设置返回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 < 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

    }

}

对于@ Lamar的解决方案,但应用程序因错误而崩溃: enter image description here

6 个答案:

答案 0 :(得分:21)

我在扩展程序中使用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
}

答案 1 :(得分:7)

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

答案 2 :(得分:3)

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

答案 3 :(得分:1)

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

  

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

numberOfRowsInSection {p>你有类似的东西:

     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
      }

答案 4 :(得分:1)

也许有点晚了,但是这里有更多的基于约束的解决方案。仍然可以帮助一些人。

首先创建一些空状态消息(您也可以使用图像或其他内容创建自己的更复杂的视图)。

    lazy var emptyStateMessage: UILabel = {
        let messageLabel = UILabel()
        messageLabel.translatesAutoresizingMaskIntoConstraints = false
        messageLabel.textColor = .darkGray
        messageLabel.numberOfLines = 0;
        messageLabel.textAlignment = .center;
        messageLabel.font = UIFont.systemFont(ofSize: 15)
        messageLabel.sizeToFit()
        return messageLabel
    }()

然后添加两个方法,并在需要时调用它们。

    func showEmptyState() {
        collectionView.addSubview(emptyStateMessage)
        emptyStateMessage.centerXAnchor.constraint(equalTo: collectionView.centerXAnchor).activate()
        emptyStateMessage.centerYAnchor.constraint(equalTo: collectionView.centerYAnchor).activate()
    }

    func hideEmptyState() {
        emptyStateMessage.removeFromSuperview()
    }

答案 5 :(得分:0)

你为什么不用:

  

open var backgroundView: UIView?

     

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

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

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