// // CLBaseTableController.swift // Crush // // Created by Leon on 2025/7/20. // import UIKit import SnapKit class CLBaseTableController: CLBaseViewController, UITableViewDelegate, UITableViewDataSource { // MARK: - Properties var tableView: UITableView! var page: Int = 1 var pageSize: Int = 10 var datas: [Any] = [] var listViewDidScrollCallback: ((UIScrollView) -> Void)? // MARK: - Lifecycle override func viewDidLoad() { super.viewDidLoad() initData() initUI() } // MARK: - Setup private func initData() { page = 1 pageSize = 10 datas = [] } private func initUI() { tableView = UITableView(frame: .zero, style: .plain) tableView.separatorStyle = .none tableView.delegate = self tableView.dataSource = self tableView.estimatedRowHeight = 80 tableView.sectionHeaderHeight = 0 tableView.sectionFooterHeight = 0 tableView.estimatedSectionHeaderHeight = 0 tableView.estimatedSectionFooterHeight = 0 tableView.backgroundColor = .clear tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: UIWindow.safeAreaBottom + 16, right: 0) tableView.contentInsetAdjustmentBehavior = .never if #available(iOS 15.0, *) { tableView.sectionHeaderTopPadding = 0 } view.addSubview(tableView) tableView.snp.makeConstraints { make in make.leading.trailing.top.bottom.equalTo(view) } } // MARK: - Public Methods func addRefreshHeaderFooter() { addRefreshHeader() addRefreshFooter() } func addRefreshHeader() { RefreshHeaderAnimator { [weak self] in self?.loadNewData() }.link(to: tableView) } func addRefreshFooter() { RefreshFooterAnimator { [weak self] in self?.loadMoreData() }.link(to: tableView) } func removeRefreshHeader() { tableView.mj_header = nil } func removeRefreshFooter() { tableView.mj_footer = nil } func loadNewData() { page = 1 loadData() } func loadMoreData() { page += 1 loadData() } func loadData() { // To be implemented by subclasses } func scrollCurrentContentTop() { tableView.setContentOffset(.zero, animated: true) } // MARK: - UITableViewDataSource func numberOfSections(in tableView: UITableView) -> Int { return 1 } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return datas.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell") ?? UITableViewCell(style: .default, reuseIdentifier: "cell") return cell } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { } func scrollViewDidScroll(_ scrollView: UIScrollView) { listViewDidScrollCallback?(scrollView) } }