swift tableView registerCell基于协议的实现和使用

来源:互联网 发布:温长卿 知乎 编辑:程序博客网 时间:2024/05/21 09:55
//
//
//  Created by zhuangch on 16/10/26.
//  Copyright © 2016年. All rights reserved.
//

import UIKit

protocol ABReusableView: class {
    static var defaultReuseIdentifier: String { get }
}

extension ABReusableView where Self: UIView {
    static var defaultReuseIdentifier: String {
        return NSStringFromClass(self)
    }
}

extension UITableViewCell: ABReusableView {
}

protocol ABNibLoadableView: class {
    static var nibName: String { get }
}

extension ABNibLoadableView where Self: UIView {
    static var nibName: String {
        return NSStringFromClass(self).components(separatedBy: ".").last!
    }
}

extension UITableView {
    func register<T: UITableViewCell>(_: T.Type) where T: ABReusableView, T: ABNibLoadableView {
        let bundle = Bundle(for: T.self)
        let nib = UINib(nibName: T.nibName, bundle: bundle)
        
        register(nib, forCellReuseIdentifier: T.defaultReuseIdentifier)
    }
    
    func register<T: UITableViewCell>(_: T.Type) where T: ABReusableView {
        register(T.self, forCellReuseIdentifier: T.defaultReuseIdentifier)
    }
    
    func dequeueReusableCell<T: UITableViewCell>(for indexPath: IndexPath) -> T where T: ABReusableView {
        guard let cell = dequeueReusableCell(withIdentifier: T.defaultReuseIdentifier, for: indexPath) as? T else {
            fatalError("Could not dequeue cell with identifier: \(T.defaultReuseIdentifier)")
        }
        
        return cell
    }
}

使用方法:

自定义的cell需要继承ABNibLoadableView

注册:tableView.register(CustomedCell.self)

let cell: CustomedCell = tableView.dequeueReusableCell(for: indexPath)

1 0
原创粉丝点击