一行代码自动适配空白页view(练手Demo)

前言

Swift终于稳定了,抽空看了遍语法,写个Demo找手感。项目中经常会出现无数据或者无网页面需要适配,so... JKPlaceholderView来了。

表现

placeholder.gif

看点

没什么技术含量,链式配置各参数,基本一行代码可以搞定所需适配页面。此处偷师RXSwift中的写法,优雅的表达方式:

private var jk_placeholder_key: UInt8 = 0

struct JK<T> {
    let base: T
    init(_ base: T) {
        self.base = base
    }
}

protocol JKCompatible {
    associatedtype JKBase
    
    var jk: JK<JKBase> { get set }
}

extension JKCompatible {
    var jk: JK<Self> {
        get {JK(self)}
        set {}
    }
}

extension JK where T: UIView {
    var placeholder: JKPlaceholderView {
        set {
            for view in base.subviews {
                if view is JKPlaceholderView {
                    view.removeFromSuperview()
                }
            }
            objc_setAssociatedObject(base, &jk_placeholder_key, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
            base.addSubview(newValue)
            reload()
        }
        get {
            objc_getAssociatedObject(base, &jk_placeholder_key) as! JKPlaceholderView
        }
    }
    
    func reload() {
        if let s = base as? UIScrollView {
            base.jk.placeholder.isHidden = s.jk.dataCount() > 0
        } else {
            base.jk.placeholder.isHidden = true
        }
        base.bringSubviewToFront(base.jk.placeholder)
    }
    
    func reload(show: Bool) {
        base.jk.placeholder.isHidden = !show
        base.bringSubviewToFront(base.jk.placeholder)
    }
    
}

extension JK where T: UIScrollView {
    private func dataCount() -> Int {
        var count = 0
        if let tableView = base as? UITableView {
            tableView.reloadData()
            for section in 0..<tableView.numberOfSections {
                count += tableView.numberOfRows(inSection: section)
            }
            
        } else if let collectionView = base as? UICollectionView {
            collectionView.reloadData()
            for section in 0..<collectionView.numberOfSections {
                count += collectionView.numberOfItems(inSection: section)
            }
        }
        return count
    }
}


extension UIView: JKCompatible {}

地址

Demo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容