diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2b60b00..1a8e65c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,8 +2,15 @@
All notable changes to this project will be documented in this file.
-## [2.0.0](https://github.com/maxsokolov/TableKit/releases/tag/1.4.0)
-Released on 2016-09-06. Breaking changes in 2.0.0:
+## [2.1.0](https://github.com/maxsokolov/TableKit/releases/tag/1.4.0)
+Released on 2016-10-19.
+- `action` method was deprecated on TableRow. Use `on` instead.
+- Support multiple actions with same type on row.
+- You could now build your own cell height calculating strategy. See [TablePrototypeCellHeightCalculator](Sources/TablePrototypeCellHeightCalculator.swift).
+- Default distance between sections changed to `UITableViewAutomaticDimension`. You can customize it, see [TableSection](Sources/TableSection.swift)
+
+## [2.0.0](https://github.com/maxsokolov/TableKit/releases/tag/2.0.0)
+Released on 2016-10-06. Breaking changes in 2.0.0:
The signatures of `TableRow` and `TableRowAction` classes were changed from
```swift
let action = TableRowAction(.click) { (data) in
diff --git a/Demo/Classes/Presentation/Controllers/MainController.swift b/Demo/Classes/Presentation/Controllers/MainController.swift
index 7c0afdd..50a244a 100644
--- a/Demo/Classes/Presentation/Controllers/MainController.swift
+++ b/Demo/Classes/Presentation/Controllers/MainController.swift
@@ -23,9 +23,9 @@ class MainController: UIViewController {
title = "TableKit"
- let clickAction = TableRowAction(.click) { [weak self] (data) in
+ let clickAction = TableRowAction(.click) { [weak self] (options) in
- switch (data.indexPath as NSIndexPath).row {
+ switch options.indexPath.row {
case 0:
self?.performSegue(withIdentifier: "autolayoutcells", sender: nil)
case 1:
@@ -34,11 +34,16 @@ class MainController: UIViewController {
break
}
}
+
+ let printClickAction = TableRowAction(.click) { (options) in
+
+ print("click", options.indexPath)
+ }
let rows = [
- TableRow(item: "Autolayout cells", actions: [clickAction]),
- TableRow(item: "Nib cells", actions: [clickAction])
+ TableRow(item: "Autolayout cells", actions: [clickAction, printClickAction]),
+ TableRow(item: "Nib cells", actions: [clickAction, printClickAction])
]
// automatically creates a section, also could be used like tableDirector.append(rows: rows)
diff --git a/Demo/Classes/Presentation/Controllers/NibCellsController.swift b/Demo/Classes/Presentation/Controllers/NibCellsController.swift
index 32736a6..544a095 100644
--- a/Demo/Classes/Presentation/Controllers/NibCellsController.swift
+++ b/Demo/Classes/Presentation/Controllers/NibCellsController.swift
@@ -21,12 +21,13 @@ class NibCellsController: UITableViewController {
tableDirector = TableDirector(tableView: tableView)
let numbers = [1000, 2000, 3000, 4000, 5000]
-
- let shouldHighlightAction = TableRowAction(.shouldHighlight) { (_) -> Bool in
- return false
- }
- let rows = numbers.map { TableRow(item: $0, actions: [shouldHighlightAction]) }
+ let rows = numbers.map {
+ TableRow(item: $0)
+ .on(.shouldHighlight) { (_) -> Bool in
+ return false
+ }
+ }
tableDirector.append(rows: rows)
}
diff --git a/README.md b/README.md
index dfad30d..22565d4 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
-
+
@@ -84,13 +84,14 @@ You could have as many rows and sections as you need.
It nice to have some actions that related to your cells:
```swift
-let action = TableRowAction(.click) { (data) in
+let action = TableRowAction(.click) { (options) in
// you could access any useful information that relates to the action
- // data.cell - StringTableViewCell?
- // data.item - String
- // data.indexPath - IndexPath
+ // options.cell - StringTableViewCell?
+ // options.item - String
+ // options.indexPath - IndexPath
+ // options.userInfo - [AnyHashable: Any]?
}
let row = TableRow(item: "some", actions: [action])
@@ -98,10 +99,10 @@ let row = TableRow(item: "some", actions: [action])
Or, using nice chaining approach:
```swift
let row = TableRow(item: "some")
- .action(.click) { (data) in
+ .on(.click) { (options) in
}
- .action(.shouldHighlight) { (data) -> Bool in
+ .on(.shouldHighlight) { (options) -> Bool in
return false
}
```
@@ -126,10 +127,29 @@ class MyTableViewCell: UITableViewCell, ConfigurableCell {
```
And handle them accordingly:
```swift
-let myAction = TableRowAction(.custom(MyActions.ButtonClicked)) { (data) in
+let myAction = TableRowAction(.custom(MyActions.ButtonClicked)) { (options) in
}
```
+## Multiple actions with same type
+
+It's also possible to use multiple actions with same type:
+```swift
+let click1 = TableRowAction(.click) { (options) in }
+click1.id = "click1" // optional
+
+let click2 = TableRowAction(.click) { (options) in }
+click2.id = "click2" // optional
+
+let row = TableRow(item: "some", actions: [click1, click2])
+```
+Could be useful in case if you want to separate your logic somehow. Actions will be invoked in order which they were attached.
+> If you define multiple actions with same type which also return a value, only last return value will be used for table view.
+
+You could also remove any action by id:
+```swift
+row.removeAction(forActionId: "action_id")
+```
# Advanced
@@ -149,7 +169,7 @@ It's enough for most cases. But you may be not happy with this. So you could use
```swift
tableDirector.shouldUsePrototypeCellHeightCalculation = true
```
-It does all dirty work with prototypes for you [behind the scene](Sources/HeightStrategy.swift), so you don't have to worry about anything except of your cell configuration:
+It does all dirty work with prototypes for you [behind the scene](Sources/TablePrototypeCellHeightCalculator.swift), so you don't have to worry about anything except of your cell configuration:
```swift
class ImageTableViewCell: UITableViewCell, ConfigurableCell {
diff --git a/Sources/TableCellAction.swift b/Sources/TableCellAction.swift
index 0e30413..b962dab 100644
--- a/Sources/TableCellAction.swift
+++ b/Sources/TableCellAction.swift
@@ -20,10 +20,6 @@
import UIKit
-struct TableKitNotifications {
- static let CellAction = "TableKitNotificationsCellAction"
-}
-
/**
A custom action that you can trigger from your cell.
You can easily catch actions using a chaining manner with your row.
diff --git a/Sources/TableDirector.swift b/Sources/TableDirector.swift
index ecf798a..24dfeb5 100644
--- a/Sources/TableDirector.swift
+++ b/Sources/TableDirector.swift
@@ -29,13 +29,15 @@ open class TableDirector: NSObject, UITableViewDataSource, UITableViewDelegate {
open private(set) var sections = [TableSection]()
private weak var scrollDelegate: UIScrollViewDelegate?
- private var heightStrategy: CellHeightCalculatable?
private var cellRegisterer: TableCellRegisterer?
-
+ public var rowHeightCalculator: RowHeightCalculator?
+
open var shouldUsePrototypeCellHeightCalculation: Bool = false {
didSet {
if shouldUsePrototypeCellHeightCalculation {
- heightStrategy = PrototypeHeightStrategy(tableView: tableView)
+ rowHeightCalculator = TablePrototypeCellHeightCalculator(tableView: tableView)
+ } else {
+ rowHeightCalculator = nil
}
}
}
@@ -50,7 +52,7 @@ open class TableDirector: NSObject, UITableViewDataSource, UITableViewDelegate {
if shouldUseAutomaticCellRegistration {
self.cellRegisterer = TableCellRegisterer(tableView: tableView)
}
-
+
self.scrollDelegate = scrollDelegate
self.tableView = tableView
self.tableView?.delegate = self
@@ -70,8 +72,8 @@ open class TableDirector: NSObject, UITableViewDataSource, UITableViewDelegate {
// MARK: Public
@discardableResult
- open func invoke(action: TableRowActionType, cell: UITableViewCell?, indexPath: IndexPath) -> Any? {
- return sections[indexPath.section].rows[indexPath.row].invoke(action, cell: cell, path: indexPath)
+ open func invoke(action: TableRowActionType, cell: UITableViewCell?, indexPath: IndexPath, userInfo: [AnyHashable: Any]? = nil) -> Any? {
+ return sections[indexPath.section].rows[indexPath.row].invoke(action: action, cell: cell, path: indexPath, userInfo: userInfo)
}
open override func responds(to selector: Selector) -> Bool {
@@ -85,33 +87,34 @@ open class TableDirector: NSObject, UITableViewDataSource, UITableViewDelegate {
// MARK: - Internal -
func hasAction(_ action: TableRowActionType, atIndexPath indexPath: IndexPath) -> Bool {
- return sections[indexPath.section].rows[indexPath.row].hasAction(action)
+ return sections[indexPath.section].rows[indexPath.row].has(action: action)
}
func didReceiveAction(_ notification: Notification) {
guard let action = notification.object as? TableCellAction, let indexPath = tableView?.indexPath(for: action.cell) else { return }
- invoke(action: .custom(action.key), cell: action.cell, indexPath: indexPath)
+ invoke(action: .custom(action.key), cell: action.cell, indexPath: indexPath, userInfo: notification.userInfo)
}
// MARK: - Height
open func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
-
+
let row = sections[indexPath.section].rows[indexPath.row]
-
- cellRegisterer?.register(cellType: row.cellType, forCellReuseIdentifier: row.reuseIdentifier)
-
- return row.estimatedHeight ?? heightStrategy?.estimatedHeight(row, path: indexPath) ?? UITableViewAutomaticDimension
+ return row.estimatedHeight ?? rowHeightCalculator?.estimatedHeight(forRow: row, at: indexPath) ?? UITableViewAutomaticDimension
}
open func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
let row = sections[indexPath.section].rows[indexPath.row]
+
+ if shouldUsePrototypeCellHeightCalculation {
+ cellRegisterer?.register(cellType: row.cellType, forCellReuseIdentifier: row.reuseIdentifier)
+ }
let rowHeight = invoke(action: .height, cell: nil, indexPath: indexPath) as? CGFloat
- return rowHeight ?? row.defaultHeight ?? heightStrategy?.height(row, path: indexPath) ?? UITableViewAutomaticDimension
+ return rowHeight ?? row.defaultHeight ?? rowHeightCalculator?.height(forRow: row, at: indexPath) ?? UITableViewAutomaticDimension
}
// MARK: UITableViewDataSource - configuration
@@ -127,6 +130,9 @@ open class TableDirector: NSObject, UITableViewDataSource, UITableViewDelegate {
open func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let row = sections[indexPath.section].rows[indexPath.row]
+
+ cellRegisterer?.register(cellType: row.cellType, forCellReuseIdentifier: row.reuseIdentifier)
+
let cell = tableView.dequeueReusableCell(withIdentifier: row.reuseIdentifier, for: indexPath)
if cell.frame.size.width != tableView.frame.size.width {
@@ -163,13 +169,13 @@ open class TableDirector: NSObject, UITableViewDataSource, UITableViewDelegate {
open func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
let section = sections[section]
- return section.headerHeight ?? section.headerView?.frame.size.height ?? 0
+ return section.headerHeight ?? section.headerView?.frame.size.height ?? UITableViewAutomaticDimension
}
open func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
let section = sections[section]
- return section.footerHeight ?? section.footerView?.frame.size.height ?? 0
+ return section.footerHeight ?? section.footerView?.frame.size.height ?? UITableViewAutomaticDimension
}
// MARK: UITableViewDelegate - actions
@@ -252,8 +258,7 @@ open class TableDirector: NSObject, UITableViewDataSource, UITableViewDelegate {
return self
}
- @discardableResult
- open func delete(index: Int) -> Self {
+ open func delete(sectionAt index: Int) -> Self {
sections.remove(at: index)
return self
@@ -262,7 +267,19 @@ open class TableDirector: NSObject, UITableViewDataSource, UITableViewDelegate {
@discardableResult
open func clear() -> Self {
+ rowHeightCalculator?.invalidate()
sections.removeAll()
+
+ return self
+ }
+
+ // MARK: - deprecated methods -
+
+ @available(*, deprecated, message: "Use 'delete(sectionAt:)' method instead")
+ @discardableResult
+ open func delete(index: Int) -> Self {
+
+ sections.remove(at: index)
return self
}
}
diff --git a/Sources/TableKit.swift b/Sources/TableKit.swift
new file mode 100644
index 0000000..bff0ef4
--- /dev/null
+++ b/Sources/TableKit.swift
@@ -0,0 +1,86 @@
+//
+// Copyright (c) 2015 Max Sokolov https://twitter.com/max_sokolov
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of
+// this software and associated documentation files (the "Software"), to deal in
+// the Software without restriction, including without limitation the rights to
+// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+// the Software, and to permit persons to whom the Software is furnished to do so,
+// subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+import UIKit
+
+struct TableKitNotifications {
+ static let CellAction = "TableKitNotificationsCellAction"
+}
+
+public protocol RowConfigurable {
+
+ func configure(_ cell: UITableViewCell)
+}
+
+public protocol RowActionable {
+
+ var editingActions: [UITableViewRowAction]? { get }
+ func isEditingAllowed(forIndexPath indexPath: IndexPath) -> Bool
+
+ func invoke(action: TableRowActionType, cell: UITableViewCell?, path: IndexPath, userInfo: [AnyHashable: Any]?) -> Any?
+ func has(action: TableRowActionType) -> Bool
+}
+
+public protocol RowHashable {
+
+ var hashValue: Int { get }
+}
+
+public protocol Row: RowConfigurable, RowActionable, RowHashable {
+
+ var reuseIdentifier: String { get }
+ var cellType: AnyClass { get }
+
+ var estimatedHeight: CGFloat? { get }
+ var defaultHeight: CGFloat? { get }
+}
+
+public enum TableRowActionType {
+
+ case click
+ case clickDelete
+ case select
+ case deselect
+ case willSelect
+ case willDisplay
+ case shouldHighlight
+ case height
+ case canEdit
+ case configure
+ case custom(String)
+
+ var key: String {
+
+ switch (self) {
+ case .custom(let key):
+ return key
+ default:
+ return "_\(self)"
+ }
+ }
+}
+
+public protocol RowHeightCalculator {
+
+ func height(forRow row: Row, at indexPath: IndexPath) -> CGFloat
+ func estimatedHeight(forRow row: Row, at indexPath: IndexPath) -> CGFloat
+
+ func invalidate()
+}
diff --git a/Sources/HeightStrategy.swift b/Sources/TablePrototypeCellHeightCalculator.swift
similarity index 85%
rename from Sources/HeightStrategy.swift
rename to Sources/TablePrototypeCellHeightCalculator.swift
index 850dde9..0f29a6f 100644
--- a/Sources/HeightStrategy.swift
+++ b/Sources/TablePrototypeCellHeightCalculator.swift
@@ -20,26 +20,18 @@
import UIKit
-public protocol CellHeightCalculatable {
+open class TablePrototypeCellHeightCalculator: RowHeightCalculator {
- func height(_ row: Row, path: IndexPath) -> CGFloat
- func estimatedHeight(_ row: Row, path: IndexPath) -> CGFloat
-
- func invalidate()
-}
-
-open class PrototypeHeightStrategy: CellHeightCalculatable {
-
- private weak var tableView: UITableView?
+ private(set) weak var tableView: UITableView?
private var prototypes = [String: UITableViewCell]()
private var cachedHeights = [Int: CGFloat]()
private var separatorHeight = 1 / UIScreen.main.scale
- init(tableView: UITableView?) {
+ public init(tableView: UITableView?) {
self.tableView = tableView
}
- open func height(_ row: Row, path: IndexPath) -> CGFloat {
+ open func height(forRow row: Row, at indexPath: IndexPath) -> CGFloat {
guard let tableView = tableView else { return 0 }
@@ -71,7 +63,7 @@ open class PrototypeHeightStrategy: CellHeightCalculatable {
return height
}
- open func estimatedHeight(_ row: Row, path: IndexPath) -> CGFloat {
+ open func estimatedHeight(forRow row: Row, at indexPath: IndexPath) -> CGFloat {
guard let tableView = tableView else { return 0 }
diff --git a/Sources/TableRow.swift b/Sources/TableRow.swift
index 6cf3738..631768c 100644
--- a/Sources/TableRow.swift
+++ b/Sources/TableRow.swift
@@ -20,38 +20,10 @@
import UIKit
-public protocol RowConfigurable {
-
- func configure(_ cell: UITableViewCell)
-}
-
-public protocol RowActionable {
-
- var editingActions: [UITableViewRowAction]? { get }
- func isEditingAllowed(forIndexPath indexPath: IndexPath) -> Bool
-
- func invoke(_ action: TableRowActionType, cell: UITableViewCell?, path: IndexPath) -> Any?
- func hasAction(_ action: TableRowActionType) -> Bool
-}
-
-public protocol RowHashable {
-
- var hashValue: Int { get }
-}
-
-public protocol Row: RowConfigurable, RowActionable, RowHashable {
-
- var reuseIdentifier: String { get }
- var cellType: AnyClass { get }
-
- var estimatedHeight: CGFloat? { get }
- var defaultHeight: CGFloat? { get }
-}
-
open class TableRow: Row where CellType: UITableViewCell {
open let item: CellType.T
- private lazy var actions = [String: TableRowAction]()
+ private lazy var actions = [String: [TableRowAction]]()
private(set) open var editingActions: [UITableViewRowAction]?
open var hashValue: Int {
@@ -78,29 +50,32 @@ open class TableRow: Row where CellType: UITableView
self.item = item
self.editingActions = editingActions
- actions?.forEach { self.actions[$0.type.key] = $0 }
+ actions?.forEach { on($0) }
}
// MARK: - RowConfigurable -
open func configure(_ cell: UITableViewCell) {
+
(cell as? CellType)?.configure(with: item)
}
// MARK: - RowActionable -
- open func invoke(_ action: TableRowActionType, cell: UITableViewCell?, path: IndexPath) -> Any? {
- return actions[action.key]?.invoke(item: item, cell: cell, path: path)
+ open func invoke(action: TableRowActionType, cell: UITableViewCell?, path: IndexPath, userInfo: [AnyHashable: Any]? = nil) -> Any? {
+
+ return actions[action.key]?.flatMap({ $0.invokeActionOn(cell: cell, item: item, path: path, userInfo: userInfo) }).last
}
- open func hasAction(_ action: TableRowActionType) -> Bool {
+ open func has(action: TableRowActionType) -> Bool {
+
return actions[action.key] != nil
}
open func isEditingAllowed(forIndexPath indexPath: IndexPath) -> Bool {
if actions[TableRowActionType.canEdit.key] != nil {
- return invoke(.canEdit, cell: nil, path: indexPath) as? Bool ?? false
+ return invoke(action: .canEdit, cell: nil, path: indexPath) as? Bool ?? false
}
return editingActions?.isEmpty == false || actions[TableRowActionType.clickDelete.key] != nil
}
@@ -108,16 +83,49 @@ open class TableRow: Row where CellType: UITableView
// MARK: - actions -
@discardableResult
- open func action(_ action: TableRowAction) -> Self {
+ open func on(_ action: TableRowAction) -> Self {
+
+ if actions[action.type.key] == nil {
+ actions[action.type.key] = [TableRowAction]()
+ }
+ actions[action.type.key]?.append(action)
- actions[action.type.key] = action
return self
}
+
+ @discardableResult
+ open func on(_ type: TableRowActionType, handler: @escaping (_ options: TableRowActionOptions) -> T) -> Self {
+
+ return on(TableRowAction(type, handler: handler))
+ }
+
+ open func removeAllActions() {
+
+ actions.removeAll()
+ }
+ open func removeAction(forActionId actionId: String) {
+
+ for (key, value) in actions {
+ if let actionIndex = value.index(where: { $0.id == actionId }) {
+ actions[key]?.remove(at: actionIndex)
+ }
+ }
+ }
+
+ // MARK: - deprecated actions -
+
+ @available(*, deprecated, message: "Use 'on' method instead")
@discardableResult
- open func action(_ type: TableRowActionType, handler: @escaping (_ data: TableRowActionData) -> T) -> Self {
+ open func action(_ action: TableRowAction) -> Self {
+
+ return on(action)
+ }
+
+ @available(*, deprecated, message: "Use 'on' method instead")
+ @discardableResult
+ open func action(_ type: TableRowActionType, handler: @escaping (_ options: TableRowActionOptions) -> T) -> Self {
- actions[type.key] = TableRowAction(type, handler: handler)
- return self
+ return on(TableRowAction(type, handler: handler))
}
}
diff --git a/Sources/TableRowAction.swift b/Sources/TableRowAction.swift
index 2533b6a..40760cb 100644
--- a/Sources/TableRowAction.swift
+++ b/Sources/TableRowAction.swift
@@ -20,32 +20,7 @@
import UIKit
-public enum TableRowActionType {
-
- case click
- case clickDelete
- case select
- case deselect
- case willSelect
- case willDisplay
- case shouldHighlight
- case height
- case canEdit
- case configure
- case custom(String)
-
- var key: String {
-
- switch (self) {
- case .custom(let key):
- return key
- default:
- return "_\(self)"
- }
- }
-}
-
-open class TableRowActionData where CellType: UITableViewCell {
+open class TableRowActionOptions where CellType: UITableViewCell {
open let item: CellType.T
open let cell: CellType?
@@ -63,38 +38,48 @@ open class TableRowActionData where CellType: UITabl
private enum TableRowActionHandler where CellType: UITableViewCell {
- case voidAction((TableRowActionData) -> Void)
- case action((TableRowActionData) -> Any?)
+ case voidAction((TableRowActionOptions) -> Void)
+ case action((TableRowActionOptions) -> Any?)
- func invoke(item: CellType.T, cell: UITableViewCell?, path: IndexPath) -> Any? {
+ func invoke(withOptions options: TableRowActionOptions) -> Any? {
switch self {
case .voidAction(let handler):
- return handler(TableRowActionData(item: item, cell: cell as? CellType, path: path, userInfo: nil))
+ handler(options)
+ return nil
case .action(let handler):
- return handler(TableRowActionData(item: item, cell: cell as? CellType, path: path, userInfo: nil))
+ return handler(options)
}
}
}
open class TableRowAction where CellType: UITableViewCell {
+ open var id: String?
open let type: TableRowActionType
private let handler: TableRowActionHandler
- public init(_ type: TableRowActionType, handler: @escaping (_ data: TableRowActionData) -> Void) {
+ public init(_ type: TableRowActionType, handler: @escaping (_ options: TableRowActionOptions) -> Void) {
self.type = type
self.handler = .voidAction(handler)
}
- public init(_ type: TableRowActionType, handler: @escaping (_ data: TableRowActionData) -> T) {
+ public init(_ key: String, handler: @escaping (_ options: TableRowActionOptions) -> Void) {
+
+ self.type = .custom(key)
+ self.handler = .voidAction(handler)
+ }
+
+ public init(_ type: TableRowActionType, handler: @escaping (_ options: TableRowActionOptions) -> T) {
self.type = type
self.handler = .action(handler)
}
- func invoke(item: CellType.T, cell: UITableViewCell?, path: IndexPath) -> Any? {
- return handler.invoke(item: item, cell: cell, path: path)
+ public func invokeActionOn(cell: UITableViewCell?, item: Any, path: IndexPath, userInfo: [AnyHashable: Any]?) -> Any? {
+ guard let item = item as? CellType.T else { return nil }
+
+ return handler.invoke(withOptions: TableRowActionOptions(item: item, cell: cell as? CellType, path: path, userInfo: userInfo))
}
}
diff --git a/Sources/TableSection.swift b/Sources/TableSection.swift
index 127ee0e..273701e 100644
--- a/Sources/TableSection.swift
+++ b/Sources/TableSection.swift
@@ -88,6 +88,13 @@ open class TableSection {
rows[index] = row
}
+ open func delete(rowAt index: Int) {
+ rows.remove(at: index)
+ }
+
+ // MARK: - deprecated methods -
+
+ @available(*, deprecated, message: "Use 'delete(rowAt:)' method instead")
open func delete(index: Int) {
rows.remove(at: index)
}
diff --git a/TableKit.podspec b/TableKit.podspec
index 1af280b..557a116 100644
--- a/TableKit.podspec
+++ b/TableKit.podspec
@@ -2,7 +2,7 @@ Pod::Spec.new do |s|
s.name = 'TableKit'
s.module_name = 'TableKit'
- s.version = '2.0.0'
+ s.version = '2.1.0'
s.homepage = 'https://github.com/maxsokolov/TableKit'
s.summary = 'Type-safe declarative table views with Swift.'
diff --git a/TableKit.xcodeproj/project.pbxproj b/TableKit.xcodeproj/project.pbxproj
index 458862d..c2ace6d 100644
--- a/TableKit.xcodeproj/project.pbxproj
+++ b/TableKit.xcodeproj/project.pbxproj
@@ -8,8 +8,9 @@
/* Begin PBXBuildFile section */
50CF6E6B1D6704FE004746FF /* TableCellRegisterer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50CF6E6A1D6704FE004746FF /* TableCellRegisterer.swift */; };
+ 50E858581DB153F500A9AA55 /* TableKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E858571DB153F500A9AA55 /* TableKit.swift */; };
DA9EA7AF1D0EC2C90021F650 /* ConfigurableCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA9EA7A61D0EC2C90021F650 /* ConfigurableCell.swift */; };
- DA9EA7B01D0EC2C90021F650 /* HeightStrategy.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA9EA7A71D0EC2C90021F650 /* HeightStrategy.swift */; };
+ DA9EA7B01D0EC2C90021F650 /* TablePrototypeCellHeightCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA9EA7A71D0EC2C90021F650 /* TablePrototypeCellHeightCalculator.swift */; };
DA9EA7B11D0EC2C90021F650 /* Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA9EA7A81D0EC2C90021F650 /* Operators.swift */; };
DA9EA7B21D0EC2C90021F650 /* TableCellAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA9EA7A91D0EC2C90021F650 /* TableCellAction.swift */; };
DA9EA7B31D0EC2C90021F650 /* TableDirector.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA9EA7AA1D0EC2C90021F650 /* TableDirector.swift */; };
@@ -32,9 +33,10 @@
/* Begin PBXFileReference section */
50CF6E6A1D6704FE004746FF /* TableCellRegisterer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableCellRegisterer.swift; sourceTree = ""; };
+ 50E858571DB153F500A9AA55 /* TableKit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableKit.swift; sourceTree = ""; };
DA9EA7561D0B679A0021F650 /* TableKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TableKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
DA9EA7A61D0EC2C90021F650 /* ConfigurableCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConfigurableCell.swift; sourceTree = ""; };
- DA9EA7A71D0EC2C90021F650 /* HeightStrategy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeightStrategy.swift; sourceTree = ""; };
+ DA9EA7A71D0EC2C90021F650 /* TablePrototypeCellHeightCalculator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TablePrototypeCellHeightCalculator.swift; sourceTree = ""; };
DA9EA7A81D0EC2C90021F650 /* Operators.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Operators.swift; sourceTree = ""; };
DA9EA7A91D0EC2C90021F650 /* TableCellAction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableCellAction.swift; sourceTree = ""; };
DA9EA7AA1D0EC2C90021F650 /* TableDirector.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableDirector.swift; sourceTree = ""; };
@@ -88,15 +90,16 @@
DA9EA7A51D0EC2B90021F650 /* Sources */ = {
isa = PBXGroup;
children = (
+ 50E858571DB153F500A9AA55 /* TableKit.swift */,
DA9EA7AA1D0EC2C90021F650 /* TableDirector.swift */,
50CF6E6A1D6704FE004746FF /* TableCellRegisterer.swift */,
DA9EA7AB1D0EC2C90021F650 /* TableRow.swift */,
DA9EA7AC1D0EC2C90021F650 /* TableRowAction.swift */,
DA9EA7AE1D0EC2C90021F650 /* TableSection.swift */,
DA9EA7A91D0EC2C90021F650 /* TableCellAction.swift */,
+ DA9EA7A71D0EC2C90021F650 /* TablePrototypeCellHeightCalculator.swift */,
DA9EA7A61D0EC2C90021F650 /* ConfigurableCell.swift */,
DA9EA7A81D0EC2C90021F650 /* Operators.swift */,
- DA9EA7A71D0EC2C90021F650 /* HeightStrategy.swift */,
);
path = Sources;
sourceTree = "";
@@ -231,11 +234,12 @@
DA9EA7AF1D0EC2C90021F650 /* ConfigurableCell.swift in Sources */,
DA9EA7B31D0EC2C90021F650 /* TableDirector.swift in Sources */,
DA9EA7B71D0EC2C90021F650 /* TableSection.swift in Sources */,
- DA9EA7B01D0EC2C90021F650 /* HeightStrategy.swift in Sources */,
+ DA9EA7B01D0EC2C90021F650 /* TablePrototypeCellHeightCalculator.swift in Sources */,
DA9EA7B51D0EC2C90021F650 /* TableRowAction.swift in Sources */,
DA9EA7B21D0EC2C90021F650 /* TableCellAction.swift in Sources */,
DA9EA7B11D0EC2C90021F650 /* Operators.swift in Sources */,
DA9EA7B41D0EC2C90021F650 /* TableRow.swift in Sources */,
+ 50E858581DB153F500A9AA55 /* TableKit.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
diff --git a/Tests/TableKitTests.swift b/Tests/TableKitTests.swift
index 014cf4d..1ac4b01 100644
--- a/Tests/TableKitTests.swift
+++ b/Tests/TableKitTests.swift
@@ -171,7 +171,7 @@ class TabletTests: XCTestCase {
let expectation = self.expectation(description: "cell action")
let row = TableRow(item: TestData(title: "title"))
- .action(TableRowAction(.custom(TestTableViewCellOptions.CellAction)) { (data) in
+ .on(TableRowAction(.custom(TestTableViewCellOptions.CellAction)) { (data) in
XCTAssertNotNil(data.cell, "Action data should have a cell")