From fd8b9956ab17a8d88eeea0776ca31f58bc588259 Mon Sep 17 00:00:00 2001 From: "Hedden, Kyle Matthew" Date: Thu, 17 Oct 2024 22:04:32 -0400 Subject: [PATCH] Digital PCT265 story MVAPCT-272: Adjust code for sectionList template. --- .../Templates/MoleculeListTemplate.swift | 9 ++- .../Templates/SectionListTemplate.swift | 72 +++++++------------ .../ProgrammaticTableViewController.swift | 6 +- 3 files changed, 39 insertions(+), 48 deletions(-) diff --git a/MVMCoreUI/Atomic/Templates/MoleculeListTemplate.swift b/MVMCoreUI/Atomic/Templates/MoleculeListTemplate.swift index c0cbc1dc..7becea19 100644 --- a/MVMCoreUI/Atomic/Templates/MoleculeListTemplate.swift +++ b/MVMCoreUI/Atomic/Templates/MoleculeListTemplate.swift @@ -99,6 +99,12 @@ open class MoleculeListTemplate: ThreeLayerTableViewController, TemplateProtocol open override func createTableView() -> TableView { let tableView = super.createTableView() + tableView.dataSource = dataSource + return tableView + } + + open override func setupDataSource(for tableView: + UITableView) -> UITableViewDataSource { dataSource = UITableViewDiffableDataSource(tableView: tableView) { [weak self] tableView, indexPath, moleculeInfo in guard let self = self, let cell = tableView.dequeueReusableCell(withIdentifier: moleculeInfo.cellReuseId), @@ -115,8 +121,7 @@ open class MoleculeListTemplate: ThreeLayerTableViewController, TemplateProtocol cell.setNeedsLayout() return cell } - tableView.dataSource = dataSource - return tableView + return dataSource } open override func parsePageJSON(loadObject: MVMCoreLoadObject) throws -> PageModelProtocol { diff --git a/MVMCoreUI/Atomic/Templates/SectionListTemplate.swift b/MVMCoreUI/Atomic/Templates/SectionListTemplate.swift index 8aa9fe7f..e5cc53b9 100644 --- a/MVMCoreUI/Atomic/Templates/SectionListTemplate.swift +++ b/MVMCoreUI/Atomic/Templates/SectionListTemplate.swift @@ -9,36 +9,32 @@ open class SectionListTemplate: MoleculeListTemplate { - public var sectionMoleculesInfo: [(header: MoleculeInfo?, footer: MoleculeInfo?, rows: [MoleculeInfo])]? - + public var sectionMoleculesInfo: [(header: SectionMoleculeInfo?, footer: SectionMoleculeInfo?)] = [] + open override func viewDidLoad() { super.viewDidLoad() tableView.sectionHeaderHeight = UITableView.automaticDimension } override func setup() { - // Create quick reference - var sectionList: [(header: MoleculeInfo?, footer: MoleculeInfo?, rows: [MoleculeInfo])] = [] + var sectionList: [(header: SectionMoleculeInfo?, footer: SectionMoleculeInfo?)] = [] - if let sections = (templateModel as? SectionListTemplateModel)?.sections { - for section in sections { - let header = createMoleculeInfo(with: section.header) - let footer = createMoleculeInfo(with: section.footer) - var rows: [MoleculeInfo] = [] - for row in section.rows { - if let rowInfo = createMoleculeInfo(with: row) { - rows.append(rowInfo) - } - } - sectionList.append((header: header, footer: footer, rows: rows)) - } + guard let sections = (templateModel as? SectionListTemplateModel)?.sections else { return } + moleculeModelCache.removeAll() // Refresh the cache for full page reload. + + var initialDataSnapshot = ListDataSnapshot() + initialDataSnapshot.appendSections(Array(0.. 0 ? sectionList : nil - } - - func getMoleculeInfo(for indexPath: IndexPath) -> MoleculeInfo? { - sectionMoleculesInfo?[indexPath.section].rows[indexPath.row] + sectionMoleculesInfo = sectionList + dataSource.apply(initialDataSnapshot) } open override func createTableView() -> TableView { @@ -46,7 +42,7 @@ open class SectionListTemplate: MoleculeListTemplate { tableView.backgroundColor = .clear tableView.separatorStyle = UITableViewCell.SeparatorStyle.none tableView.delegate = self - tableView.dataSource = self + tableView.dataSource = setupDataSource(for: tableView) tableView.insetsContentViewsToSafeArea = false return tableView } @@ -58,22 +54,18 @@ open class SectionListTemplate: MoleculeListTemplate { open override func registerWithTable() { super.registerWithTable() - guard let sections = sectionMoleculesInfo else { return } - for section in sections { + for section in sectionMoleculesInfo { if let header = section.header { tableView.register(header.class, forHeaderFooterViewReuseIdentifier: header.identifier) } if let footer = section.footer { tableView.register(footer.class, forHeaderFooterViewReuseIdentifier: footer.identifier) } - for row in section.rows { - tableView.register(row.class, forCellReuseIdentifier: row.identifier) - } } } public func tableView(_ tableView: UITableView, estimatedHeightForHeaderInSection section: Int) -> CGFloat { - guard let moleculeInfo = sectionMoleculesInfo?[section].header else { + guard let moleculeInfo = sectionMoleculesInfo[safe: section]?.header else { return CGFloat.leastNormalMagnitude } let estimatedHeight = (moleculeInfo.class as? MoleculeViewProtocol.Type)?.estimatedHeight(with: moleculeInfo.molecule, delegateObject() as? MVMCoreUIDelegateObject) @@ -81,14 +73,14 @@ open class SectionListTemplate: MoleculeListTemplate { } public func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { - guard (sectionMoleculesInfo?[section].header) != nil else { + guard (sectionMoleculesInfo[safe:section]?.header) != nil else { return CGFloat.leastNormalMagnitude } return UITableView.automaticDimension } public func tableView(_ tableView: UITableView, estimatedHeightForFooterInSection section: Int) -> CGFloat { - guard let moleculeInfo = sectionMoleculesInfo?[section].footer else { + guard let moleculeInfo = sectionMoleculesInfo[safe:section]?.footer else { return CGFloat.leastNormalMagnitude } let estimatedHeight = (moleculeInfo.class as? MoleculeViewProtocol.Type)?.estimatedHeight(with: moleculeInfo.molecule, delegateObject() as? MVMCoreUIDelegateObject) @@ -96,15 +88,14 @@ open class SectionListTemplate: MoleculeListTemplate { } public func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { - guard (sectionMoleculesInfo?[section].footer) != nil else { + guard (sectionMoleculesInfo[safe:section]?.footer) != nil else { return CGFloat.leastNormalMagnitude } return UITableView.automaticDimension } public func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { - guard let sectionInfo = sectionMoleculesInfo?[section], - let headerInfo = sectionInfo.header + guard let headerInfo = sectionMoleculesInfo[safe: section]?.header else { return nil } let header = tableView.dequeueReusableHeaderFooterView(withIdentifier: headerInfo.identifier) @@ -117,8 +108,7 @@ open class SectionListTemplate: MoleculeListTemplate { } public func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? { - guard let sectionInfo = sectionMoleculesInfo?[section], - let footerInfo = sectionInfo.footer + guard let footerInfo = sectionMoleculesInfo[safe: section]?.footer else { return nil } let footer = tableView.dequeueReusableHeaderFooterView(withIdentifier: footerInfo.identifier) @@ -130,15 +120,7 @@ open class SectionListTemplate: MoleculeListTemplate { return footer } - open override func getNumberOfSections() -> Int { - sectionMoleculesInfo?.count ?? 0 - } - - open override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - sectionMoleculesInfo?[section].rows.count ?? 0 - } - - func createMoleculeInfo(with listItem: MoleculeModelProtocol?) -> MoleculeInfo? { + func createSectionMoleculeInfo(with listItem: MoleculeModelProtocol?) -> SectionMoleculeInfo? { guard let listItem = listItem, let moleculeClass = ModelRegistry.getMoleculeClass(listItem) @@ -149,6 +131,6 @@ open class SectionListTemplate: MoleculeListTemplate { return (moleculeName, moleculeClass, listItem) } - public typealias MoleculeInfo = (identifier: String, class: AnyClass, molecule: MoleculeModelProtocol) + public typealias SectionMoleculeInfo = (identifier: String, class: AnyClass, molecule: MoleculeModelProtocol) } diff --git a/MVMCoreUI/BaseControllers/ProgrammaticTableViewController.swift b/MVMCoreUI/BaseControllers/ProgrammaticTableViewController.swift index d5a52d50..de2406f6 100644 --- a/MVMCoreUI/BaseControllers/ProgrammaticTableViewController.swift +++ b/MVMCoreUI/BaseControllers/ProgrammaticTableViewController.swift @@ -68,11 +68,15 @@ open class ProgrammaticTableViewController: ProgrammaticScrollViewController, UI tableView.backgroundColor = .clear tableView.separatorStyle = .none tableView.delegate = self - tableView.dataSource = self + tableView.dataSource = setupDataSource(for: tableView) tableView.insetsContentViewsToSafeArea = false return tableView } + open func setupDataSource(for tableView: UITableView) -> UITableViewDataSource { + return self + } + /// Registers classes and nibs. Can subclass for different nibs. Can call super and then add new ones after as well. open func registerWithTable() { }