Handling an empty UITableView. Print a friendly message

前端 未结 22 1208
青春惊慌失措
青春惊慌失措 2020-12-04 05:22

I have a UITableView that in some cases it is legal to be empty. So instead of showing the background image of the app, I would prefer to print a friendly message in the scr

22条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-12-04 06:09

    So for a safer solution:

    extension UITableView {
    func setEmptyMessage(_ message: String) {
        guard self.numberOfRows() == 0 else {
            return
        }
        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.systemFont(ofSize: 14.0, weight: UIFontWeightMedium)
        messageLabel.sizeToFit()
    
        self.backgroundView = messageLabel;
        self.separatorStyle = .none;
    }
    
    func restore() {
        self.backgroundView = nil
        self.separatorStyle = .singleLine
    }
    
    public func numberOfRows() -> Int {
        var section = 0
        var rowCount = 0
        while section < numberOfSections {
            rowCount += numberOfRows(inSection: section)
            section += 1
        }
        return rowCount
      }
    }
    

    and for UICollectionView as well:

    extension UICollectionView {
    func setEmptyMessage(_ message: String) {
        guard self.numberOfItems() == 0 else {
            return
        }
    
        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.systemFont(ofSize: 18.0, weight: UIFontWeightSemibold)
        messageLabel.sizeToFit()
        self.backgroundView = messageLabel;
    }
    
    func restore() {
        self.backgroundView = nil
    }
    
    public func numberOfItems() -> Int {
        var section = 0
        var itemsCount = 0
        while section < self.numberOfSections {
            itemsCount += numberOfItems(inSection: section)
            section += 1
        }
        return itemsCount
      }
    }
    

    More Generic Solution:

        protocol EmptyMessageViewType {
          mutating func setEmptyMessage(_ message: String)
          mutating func restore()
        }
    
        protocol ListViewType: EmptyMessageViewType where Self: UIView {
          var backgroundView: UIView? { get set }
        }
    
        extension UITableView: ListViewType {}
        extension UICollectionView: ListViewType {}
    
        extension ListViewType {
          mutating 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: 16)
            messageLabel.sizeToFit()
    
            backgroundView = messageLabel
        }
    
         mutating func restore() {
            backgroundView = nil
         }
    }
    

提交回复
热议问题