From ca4c590ea16928d9a21aff1d668e84e52e3810ca Mon Sep 17 00:00:00 2001 From: Alfredo Delli Bovi Date: Mon, 23 Jan 2017 12:07:25 +0100 Subject: [PATCH 1/3] Change visibility of UITableViewDataSource and UITableViewDelegate --- TableViewKit/TableViewManager.swift | 32 ++++++++++++++--------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/TableViewKit/TableViewManager.swift b/TableViewKit/TableViewManager.swift index d6b22f4..d4a7e73 100644 --- a/TableViewKit/TableViewManager.swift +++ b/TableViewKit/TableViewManager.swift @@ -158,18 +158,18 @@ extension TableViewManager { extension TableViewManager: UITableViewDataSource { /// Implementation of UITableViewDataSource - public func numberOfSections(in tableView: UITableView) -> Int { + open func numberOfSections(in tableView: UITableView) -> Int { return sections.count } /// Implementation of UITableViewDataSource - public func tableView(_ tableView: UITableView, numberOfRowsInSection sectionIndex: Int) -> Int { + open func tableView(_ tableView: UITableView, numberOfRowsInSection sectionIndex: Int) -> Int { let section = sections[sectionIndex] return section.items.count } /// Implementation of UITableViewDataSource - public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + open func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let currentItem = item(at: indexPath) let drawer = currentItem.drawer @@ -180,17 +180,17 @@ extension TableViewManager: UITableViewDataSource { } /// Implementation of UITableViewDataSource - public func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { + open func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { return title(for: {$0.header}, inSection: section) } /// Implementation of UITableViewDataSource - public func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String? { + open func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String? { return title(for: {$0.footer}, inSection: section) } /// Implementation of UITableViewDataSource - public func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { + open func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { // Intentionally blank. Required to use UITableViewRowActions } } @@ -198,53 +198,53 @@ extension TableViewManager: UITableViewDataSource { extension TableViewManager: UITableViewDelegate { /// Implementation of UITableViewDelegate - public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + open func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { guard let currentItem = item(at: indexPath) as? Selectable else { return } currentItem.didSelect() } /// Implementation of UITableViewDelegate - public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + open func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return height(at: indexPath) ?? tableView.rowHeight } /// Implementation of UITableViewDelegate - public func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { + open func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return height(for: {$0.header}, inSection: section) ?? tableView.sectionHeaderHeight } /// Implementation of UITableViewDelegate - public func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { + open func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { return height(for: {$0.footer}, inSection: section) ?? tableView.sectionFooterHeight } /// Implementation of UITableViewDelegate - public func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { + open func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { return estimatedHeight(at: indexPath) ?? tableView.estimatedRowHeight } /// Implementation of UITableViewDelegate - public func tableView(_ tableView: UITableView, estimatedHeightForHeaderInSection section: Int) -> CGFloat { + open func tableView(_ tableView: UITableView, estimatedHeightForHeaderInSection section: Int) -> CGFloat { return estimatedHeight(for: {$0.header}, inSection: section) ?? tableView.estimatedSectionHeaderHeight } /// Implementation of UITableViewDelegate - public func tableView(_ tableView: UITableView, estimatedHeightForFooterInSection section: Int) -> CGFloat { + open func tableView(_ tableView: UITableView, estimatedHeightForFooterInSection section: Int) -> CGFloat { return estimatedHeight(for: {$0.footer}, inSection: section) ?? tableView.estimatedSectionHeaderHeight } /// Implementation of UITableViewDelegate - public func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { + open func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { return view(for: {$0.header}, inSection: section) } /// Implementation of UITableViewDelegate - public func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? { + open func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? { return view(for: {$0.footer}, inSection: section) } /// Implementation of UITableViewDelegate - public func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? { + open func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? { guard let item = item(at: indexPath) as? Editable else { return nil } return item.actions } From ed62c63f8da3ed3a5d0a57c2c19a9368f50da2cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nelson=20Dom=C3=ADnguez?= Date: Wed, 8 Feb 2017 10:38:59 +0100 Subject: [PATCH 2/3] Fix register cell after insert item in section (#20) --- TableViewKit.podspec | 2 +- TableViewKit/Section.swift | 5 +++- .../TableViewDataSourceTests.swift | 28 +++++++++++++++++++ 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/TableViewKit.podspec b/TableViewKit.podspec index 9cbaafc..f58ebca 100644 --- a/TableViewKit.podspec +++ b/TableViewKit.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "TableViewKit" - s.version = "0.9.5" + s.version = "0.9.6" s.summary = "Empowering UITableView with painless multi-type cell support and build-in automatic state transition animations" s.homepage = "http://github.com/odigeoteam/TableViewKit/" s.license = "MIT" diff --git a/TableViewKit/Section.swift b/TableViewKit/Section.swift index daffba4..9284999 100644 --- a/TableViewKit/Section.swift +++ b/TableViewKit/Section.swift @@ -86,7 +86,10 @@ extension Section { switch changes { case .inserts(let array): - let indexPaths = array.map { IndexPath(item: $0, section: sectionIndex) } + let indexPaths = array.map { row -> IndexPath in + manager.register(items[row].drawer.type) + return IndexPath(item: row, section: sectionIndex) + } tableView.insertRows(at: indexPaths, with: manager.animation) case .deletes(let array): let indexPaths = array.map { IndexPath(item: $0, section: sectionIndex) } diff --git a/TableViewKitTests/TableViewDataSourceTests.swift b/TableViewKitTests/TableViewDataSourceTests.swift index bb2dd91..f8d523b 100644 --- a/TableViewKitTests/TableViewDataSourceTests.swift +++ b/TableViewKitTests/TableViewDataSourceTests.swift @@ -49,6 +49,19 @@ class TestCell: UITableViewCell, ItemCompatible { internal var item: Item? } +class DifferentItem: Item { + + var drawer: CellDrawer.Type = DifferentDrawer.self +} + +class DifferentDrawer: CellDrawer { + + static var type: CellType = CellType.class(DifferentCell.self) + static func draw(_ cell: UITableViewCell, with item: Any) {} +} + +class DifferentCell: UITableViewCell { } + class TableViewDataSourceTests: XCTestCase { fileprivate var tableViewManager: TableViewManager! @@ -74,6 +87,21 @@ class TableViewDataSourceTests: XCTestCase { expect(cell).to(beAnInstanceOf(TestCell.self)) } + func testDequeueCellAfterRegisterSection() { + + guard let section = tableViewManager.sections.first else { + fatalError("Couldn't get the first section") + } + + let otherItem = DifferentItem() + section.items.append(otherItem) + + let indexPath = otherItem.indexPath(in: tableViewManager)! + let cell = otherItem.drawer.cell(in: tableViewManager, with: otherItem, for: indexPath) + + XCTAssertTrue(cell is DifferentCell) + } + func testNumberOfSections() { let count = self.tableViewManager.numberOfSections(in: self.tableViewManager.tableView) expect(count).to(equal(2)) From 2507855413f287282c515e0ac504fe3975bf86c0 Mon Sep 17 00:00:00 2001 From: Alfredo Delli Bovi Date: Wed, 8 Feb 2017 10:41:06 +0100 Subject: [PATCH 3/3] Extract register for item insertions --- TableViewKit/Section.swift | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/TableViewKit/Section.swift b/TableViewKit/Section.swift index 9284999..9002def 100644 --- a/TableViewKit/Section.swift +++ b/TableViewKit/Section.swift @@ -83,13 +83,14 @@ extension Section { guard let sectionIndex = index(in: manager) else { return } let tableView = manager.tableView - + + if case .inserts(let array) = changes { + array.forEach { manager.register(items[$0].drawer.type) } + } + switch changes { case .inserts(let array): - let indexPaths = array.map { row -> IndexPath in - manager.register(items[row].drawer.type) - return IndexPath(item: row, section: sectionIndex) - } + let indexPaths = array.map { IndexPath(item: $0, section: sectionIndex) } tableView.insertRows(at: indexPaths, with: manager.animation) case .deletes(let array): let indexPaths = array.map { IndexPath(item: $0, section: sectionIndex) }