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