101 lines
3.8 KiB
Swift
101 lines
3.8 KiB
Swift
//
|
||
// MPTableManager.swift
|
||
// MusicPlayer
|
||
//
|
||
// Created by Mr.Zhou on 2024/4/7.
|
||
//
|
||
|
||
import UIKit
|
||
///tableViewCell配置闭包(index-索引路径,tableView-当前表格,在VC中实现cell实体)
|
||
typealias TableViewCellConfigureBlock = (_ index:IndexPath, _ tableView:UITableView) -> UITableViewCell
|
||
///tableViewCell点击闭包(index-索引路径,tableView-当前表格,在VC中实现点击方法)
|
||
typealias TableViewCellDidSelectBlock = (_ index:IndexPath, _ tableView:UITableView) -> Void
|
||
///tableView通用控制器
|
||
class MPTableManager:NSObject {
|
||
///包含组行的数据组
|
||
private var sectionAndItems:[[Any]]?
|
||
///cell注册id组(与数据组组数相同)
|
||
private var cellIdentifiers:[String]?
|
||
//配置闭包
|
||
private var configureCellBlock:TableViewCellConfigureBlock!
|
||
//选中闭包
|
||
private var didSelectBlock:TableViewCellDidSelectBlock?
|
||
|
||
/// 自定义UITableView控制器初始化方法
|
||
/// - Parameters:
|
||
/// - sectionItems: 包含组行的二维数组数据
|
||
/// - cellIdentifier: cell注册ID组(与sectionItems中的组数相同)
|
||
/// - configureCellBlock: cell配置闭包
|
||
/// - didSelectBlock: cell点击事件闭包
|
||
init(_ sectionItems: [[Any]]?, cellIdentifiers: [String]?, configureCellBlock: TableViewCellConfigureBlock?, didSelectBlock: TableViewCellDidSelectBlock?) {
|
||
super.init()
|
||
self.sectionAndItems = sectionItems
|
||
self.cellIdentifiers = cellIdentifiers
|
||
self.configureCellBlock = configureCellBlock
|
||
self.didSelectBlock = didSelectBlock
|
||
}
|
||
//获取索引指定的数据
|
||
private func item(_ indexPath: IndexPath) -> Any? {
|
||
if let items = sectionAndItems?[indexPath.section] {
|
||
return items[indexPath.row]
|
||
}else {
|
||
return nil
|
||
}
|
||
}
|
||
//为tableView注册delegate,datasource,以及cell,自适应高度
|
||
func handleTableViewDataSourceAndDelegate(_ tableView: UITableView?, rowHeight:CGFloat = 0) {
|
||
guard let table = tableView else {
|
||
print("TableView is null")
|
||
return
|
||
}
|
||
table.dataSource = self
|
||
table.delegate = self
|
||
table.rowHeight = rowHeight != 0 ? rowHeight:UITableView.automaticDimension
|
||
table.estimatedRowHeight = 200
|
||
guard cellIdentifiers != nil else {
|
||
return
|
||
}
|
||
cellIdentifiers!.forEach { item in
|
||
//判断未注册
|
||
guard table.dequeueReusableCell(withIdentifier: item) == nil else { return }
|
||
//判断是否存在nib文件
|
||
if let _ = Bundle.main.path(forResource: item, ofType: "nib") {
|
||
//nib注册
|
||
table.register(.init(nibName: item, bundle: nil), forCellReuseIdentifier: item)
|
||
}else {
|
||
//cell注册
|
||
table.register(item.classFromString().self, forCellReuseIdentifier: item)
|
||
}
|
||
}
|
||
}
|
||
}
|
||
//MARK: - tableView的实现
|
||
extension MPTableManager:UITableViewDataSource, UITableViewDelegate {
|
||
//返回组
|
||
func numberOfSections(in tableView: UITableView) -> Int {
|
||
guard sectionAndItems != nil else {
|
||
return 0
|
||
}
|
||
return sectionAndItems!.count
|
||
}
|
||
//返回行
|
||
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
|
||
guard let items = sectionAndItems?[section] else {
|
||
return 0
|
||
}
|
||
return items.count
|
||
}
|
||
//实现cell
|
||
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
|
||
let cell = configureCellBlock(indexPath, tableView)
|
||
return cell
|
||
}
|
||
//点击事件
|
||
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
|
||
guard didSelectBlock != nil else {
|
||
return
|
||
}
|
||
didSelectBlock!(indexPath, tableView)
|
||
}
|
||
}
|