Swift版本的TableManager

源代码 2024-9-10 02:53:35 75 0 来自 中国
一、概述

在OC的轮子中,利用一个RETableviewManager的轮子,焦点原理是数据驱动页面,cell-item 逐一对应,对UITableview页面的封装。
只要写好对应item和cell类,然后注册,交给manager即可,构建完备的页面;同时一些cell和item是可以被差异列表举行复用,只要给差异的item即可。
本人以为项目利用结果还不错,因此写了个swift版本。
TBD:如今还在一连完满中...
二、做了一些优化


  • Item 和 cell的绑定,只支持registerClass的方式。
    鼓励先注册,后续直接复用利用,克制新人错误。
    现实项目中利用nib或xib很少,根本都是纯代码编写,因此简化(着实有须要的,后续再扩展)。
  • Item 和 cell 对应关系,通过Item的类方法返回
open class var cellClass: AnyClass {    return SZTableViewCell.self}

  • cell的高度,举行属性缓存,同时提供方法放到Item中
open class func calcCellHeight() -> Float {    return 40.0}

  • cell的生命周期做了调解,新增didUpdate方法,同时方法新增入参item
    克制内部在利用属性。
protocol SZTableViewCellLifeCircel {    // 初次创建调用    func didLoad(_ item: SZTableViewItem?)        // 更新的时间调用,    func didUpdate(_ item: SZTableViewItem?)        // will display    func willAppear(_ item: SZTableViewItem?)    // end display    func didDisappear(_ item: SZTableViewItem?)}

  • 去掉原框架中的外部delegate
    现实须要本身实现代理的场景很少,纵然须要,是否也失去manager的功能;因此先不提供。
三、根本的利用方法

1、自界说 SZTableViewCell 和 SZTableViewItem 的子类
class ImageTitleCell: SZTableViewCell {    lazy var titleLbl: UILabel = {        let lbl = UILabel()        lbl.text = ""        lbl.textColor = .blue        lbl.font = .systemFont(ofSize: 16)        return lbl    }()    lazy var iconImgV: UIImageView = {        let imgV = UIImageView()        imgV.image = UIImage.init(named: "facebook")        return imgV    }()        // 加载一次,cell创建    override func didLoad(_ item: SZTableViewItem?) {        super.didLoad(item)        if let cellItem = item as? ImageTitleCellItem {            print("\(#function) \(cellItem.title)")            self.iconImgV.frame = CGRect(x: 5, y: 5, width: 50, height: 50)            self.contentView.addSubview(self.iconImgV)            self.titleLbl.frame = CGRect(x: 60, y: 5, width: 150, height: 20)            self.contentView.addSubview(self.titleLbl)        }    }    // cell数据的更新    override func didUpdate(_ item: SZTableViewItem?) {        if let cellItem = item as? ImageTitleCellItem {            print("\(#function) \(cellItem.title)")            self.titleLbl.text = cellItem.title        }    }    // cell will display    override func willAppear(_ item: SZTableViewItem?) {            }    // cell did end display    override func didDisappear(_ item: SZTableViewItem?) {            }}class ImageTitleCellItem : SZTableViewItem {    var title: String = ""        // 返回对应的cell    override class var cellClass: AnyClass {        return ImageTitleCell.self    }    // 返回Cell的高度    override func calcCellHeight() -> Float {        return 80.0    }}2、创建Manager
// ViewControllerlazy var tableview: UITableView = {    let tblV = UITableView(frame:self.view.bounds, style:.plain)    return tblV}()// managerlet tblManager: SZTableViewManager = SZTableViewManager()self.view.addSubview(self.tableview)// 关联tableviewtblManager.bindTableView(self.tableview)tblManager.registerList([    SZTitleCellItem.self,    ImageTitleCellItem.self])// 创建sectionlet section: SZTableViewSection = SZTableViewSection.init()let item = SZTitleCellItem()item.title = "TitleCell \(i)"item.action.selected = { (_ vi: SZTableViewItem? ,_ tblMgr: SZTableViewManager) in    if let cellItem = vi as? SZTitleCellItem {        print("click: \(cellItem.title)")    }}section.addItem(item)tblManager.addSection(section)四、项目的github所在如下

RETableViewManager
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-23 20:23, Processed in 0.165309 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表