美文网首页
使用协议XIB加载View

使用协议XIB加载View

作者: 米修斯_ | 来源:发表于2019-07-09 00:22 被阅读0次
//从Xib中加载View
protocol NibLoadable {
}
extension NibLoadable where Self:UIView  {
    static func loadViewFromNib() -> Self {
        return Bundle.main.loadNibNamed("\(self)", owner: nil, options: nil)?.first as! Self
    }
}
//注册UITableViewCell 
protocol RegisterCellOrNib {
}
extension RegisterCellOrNib {
    static var identifier:String {
        return "\(self)"
    }
    static var nib:UINib? {
        return UINib(nibName: "\(self)", bundle: nil)
    }
}

extension UITableView {

    func registerCell<T:UITableViewCell>(cell:T.Type) where T:RegisterCellOrNib {
        if let nib = T.nib { register(nib, forCellReuseIdentifier: T.identifier) }
        else { register(cell, forCellReuseIdentifier: T.identifier) }
    }
    /// 从缓存池池出队已经存在的 cell
    func dequeueReusableCell<T: UITableViewCell>(indexPath: IndexPath) -> T where T: RegisterCellOrNib {
        return dequeueReusableCell(withIdentifier: T.identifier, for: indexPath) as! T
    }
    func reloadRow(at indexPath:IndexPath, with animation: UITableView.RowAnimation) {
        reloadRows(at: [indexPath], with: animation)
    }
}

extension UICollectionView {
    /// 注册 cell 的方法
    func registerCell<T: UICollectionViewCell>(cell: T.Type) where T: RegisterCellOrNib {
        if let nib = T.nib { register(nib, forCellWithReuseIdentifier: T.identifier) }
        else { register(cell, forCellWithReuseIdentifier: T.identifier) }
    }
    
    /// 从缓存池池出队已经存在的 cell
    func dequeueReusableCell<T: UICollectionViewCell>(indexPath: IndexPath) -> T where T: RegisterCellOrNib {
        return dequeueReusableCell(withReuseIdentifier: T.identifier, for: indexPath) as! T
    }
    
    /// 注册头部
    func registerSupplementaryHeaderView<T: UICollectionReusableView>(reusableView: T.Type) where T: RegisterCellOrNib {
        // T 遵守了 RegisterCellOrNib 协议,所以通过 T 就能取出 identifier 这个属性
        if let nib = T.nib {
            register(nib, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: T.identifier)
        } else {
            register(reusableView, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: T.identifier)
        }
    }
    
    /// 获取可重用的头部
    func dequeueReusableSupplementaryHeaderView<T: UICollectionReusableView>(indexPath: IndexPath) -> T where T: RegisterCellOrNib {
        return dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: T.identifier, for: indexPath) as! T
    }
}

相关文章

网友评论

      本文标题:使用协议XIB加载View

      本文链接:https://www.haomeiwen.com/subject/dcozhctx.html