XYEmptyDataView
為UIView擴展的emptyData屬性,用于展示空視圖。
空數(shù)據(jù)視圖,通常是在缺省狀態(tài)下展示:不同頁面的無數(shù)據(jù)狀態(tài)、網(wǎng)絡(luò)異常。這些UI相對簡單,但是頻繁的處理不同狀態(tài)下的空數(shù)據(jù)視圖似乎有些多余,通過XYEmptyData很好的解決這個問題。
GitHub: https://github.com/tuxi/XYEmptyDataView
你可以實現(xiàn)XYEmptyDataState協(xié)議,去自定義不同狀態(tài)下的空數(shù)據(jù)視圖,這里我很中意swift中的枚舉,因為它可以很好的區(qū)分這些狀態(tài)。
使用說明
CocoaPods 安裝
pod 'XYEmptyDataView'
示例
- 初始化空視圖,初始化時設(shè)置一個初始
state,以便需要時顯示,
由UIview的實例引用了emptyData,對空視圖的操作,都在emptyData中。
func setupEmptyDataView() {
var emptyData = XYEmptyData.with(state: ExampleEmptyDataState.noMessage)
emptyData.format.contentEdgeInsets = UIEdgeInsets(top: 0, left: 50, bottom: 0, right: 50)
emptyData.format.imageSize = CGSize(width: 180, height: 180)
emptyData.delegate = self
view.emptyData = emptyData
emptyData.show()
}
- 在
UIview上展示空視圖,除了初始化以外,在需要時,需主動調(diào)用show()或者hide()去顯示或隱藏空視圖
class ExampleViewController: UIViewController {
private lazy var dataArray = [[Any]]()
private var isLoading = false {
didSet {
if isLoading == false {
if dataArray.count > 0 {
self.view.emptyData?.hide()
}
else {
self.view.emptyData?.show()
}
}
else {
self.view.emptyData?.show(with: ExampleEmptyDataState.loading)
}
}
}
}
- 在
UITableView或者UICollectionView上展示空視圖,無需主動顯示或隱藏,這是內(nèi)部已交換reloadData方法,在執(zhí)行reloadData方法時根據(jù)state刷新空視圖,你可以使用初始化時候的狀態(tài),也可以根據(jù)需求綁定一個狀態(tài),比如:無數(shù)據(jù)、網(wǎng)絡(luò)異常等,在顯示時根據(jù)狀態(tài)顯示UI。綁定狀態(tài)需要實現(xiàn)XYEmptyDataDelegateState協(xié)議
extension EmptyDataExampleTableViewController: XYEmptyDataDelegateState {
func state(forEmptyData emptyData: XYEmptyData) -> XYEmptyDataState? {
if self.isLoading == true {
return ExampleEmptyDataState.loading
}
else if let error = self.error {
return ExampleEmptyDataState.error(error)
}
else {
return ExampleEmptyDataState.noBinddate
}
}
}
示例
ExampleEmptyDataState是根據(jù)業(yè)務(wù)定義的空視圖狀態(tài),它實現(xiàn)了XYEmptyDataState協(xié)議,由于它是枚舉,所以很好的反應(yīng)不同狀態(tài)下的樣式。
enum ExampleEmptyDataState: XYEmptyDataState {
/// 無本地生活
case noLocalLife
/// 無消息
case noMessage
/// 無網(wǎng)絡(luò)
case noInternet
/// 加載中
case loading
var title: ((UILabel) -> Void)? {
return {
switch self {
case .noLocalLife,
$0.text = "空視圖測試"
case .noMessage:
$0.text = "還沒有消息呢"
case .noInternet:
$0.text = nil
case .loading:
$0.text = nil
}
}
}
var detail: ((UILabel) -> Void)? {
return {
$0.numberOfLines = 0
switch self {
case .noLocalLife,
$0.text = "暫無數(shù)據(jù)"
case .noMessage:
$0.text = "暫無消息"
case .noInternet:
$0.text = "暫無網(wǎng)絡(luò)"
case .loading:
$0.text = nil
}
}
}
var button: ((UIButton) -> Void)? {
return {
$0.backgroundColor = UIColor.blue.withAlphaComponent(0.7)
$0.layer.cornerRadius = 5.0
$0.layer.masksToBounds = true
switch self {
case .loading:
$0.setTitle(nil, for: .normal)
case .noInternet:
$0.setTitle("設(shè)置", for: .normal)
default:
$0.setTitle("點擊重試", for: .normal)
}
}
}
var image: ((UIImageView) -> Void)? {
return {
switch self {
case .noLocalLife:
$0.image = UIImage(named: "icon_default_empty")
case .noMessage:
$0.image = UIImage(named: "empty_noBinddate")
case .noInternet:
$0.image = UIImage(named: "empty_network")
case .loading:
$0.image = nil
}
}
}
var customView: UIView? {
switch self {
case .loading:
let indicatorView = UIActivityIndicatorView(style: .gray)
indicatorView.startAnimating()
return indicatorView
default:
return nil
}
}
}
<img src = "https://github.com/alpface/XYEmptyDataView/blob/master/XYEmptyDataViewExample/IMG_0778.PNG?raw=true" width = "390" height = "844" alt = "Screenshot1.png"/>