Swift 為UIView 擴展的 空數(shù)據(jù)視圖分類

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"/>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容