-
普通的tableView复用代码
WCBaseTableViewCell
class WCBaseTableViewCell: UITableViewCell {
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
self.prepareUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func prepareUI() {
self.contentView.backgroundColor = UIColor.init(red: CGFloat(arc4random_uniform(255)) / 255.0, green: CGFloat(arc4random_uniform(255)) / 255.0, blue: CGFloat(arc4random_uniform(255)) / 255.0, alpha: 1.0)
}
}
ViewController
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let ID = "WCBaseTableViewCell"
let cell = tableView.dequeueReusableCell(withIdentifier: ID) ?? WCBaseTableViewCell.init(style: .default, reuseIdentifier: ID)
return cell
}
效果
-
cell的初步封装
原来在viewController中的cell的创建过程如下
let ID = "WCBaseTableViewCell"
let cell = tableView.dequeueReusableCell(withIdentifier: ID) ?? WCBaseTableViewCell.init(style: .default, reuseIdentifier: ID)
return cell
可以发现,cell的创建过程可以在cell中使用类方法创建,具体创建过程如下,在WCBaseTableViewCell声明公共的函数
class func wc_baseTableViewCell(tableView:UITableView) -> WCBaseTableViewCell {
let ID = "WCBaseTableViewCell"
let cell = tableView.dequeueReusableCell(withIdentifier: ID) as? WCBaseTableViewCell ?? WCBaseTableViewCell.init(style: .default, reuseIdentifier: ID)
return cell
}
在ViewController中
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = WCBaseTableViewCell.wc_baseTableViewCell(tableView: tableView)
return cell
}
cell的二次封装
以上cell的类函数在每一个cell中都需要重复创建,可以创建一个基础的cell类(其他类继承它,使用公共的类方法创建)
在WCBaseTableViewCell中
class WCBaseTableViewCell: UITableViewCell {
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
self.prepareUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func prepareUI() {
self.contentView.backgroundColor = UIColor.init(red: CGFloat(arc4random_uniform(255)) / 255.0, green: CGFloat(arc4random_uniform(255)) / 255.0, blue: CGFloat(arc4random_uniform(255)) / 255.0, alpha: 1.0)
}
class func wc_baseTableViewCell(tableView:UITableView) -> UITableViewCell {
let ID = NSStringFromClass(self)
let aclass = NSClassFromString(ID) as! UITableViewCell.Type
let cell = tableView.dequeueReusableCell(withIdentifier: ID) ?? aclass.init(style: .default, reuseIdentifier: ID)
return cell
}
}
FirstTableViewCell继承WCBaseTableViewCell
class FirstTableViewCell: WCBaseTableViewCell {
override func prepareUI() {
super.prepareUI()
self.contentView.backgroundColor = .gray
}
}
在ViewController中
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = FirstTableViewCell.wc_baseTableViewCell(tableView: tableView)
return cell
}
后续的其他cell只需要继承自WCBaseTableViewCell,并且重写prepareUI()函数即可.