From e25b7d759ec40886ea8679e08d85d4d930b4a1c3 Mon Sep 17 00:00:00 2001 From: Max Sokolov Date: Sun, 15 Nov 2015 17:50:53 +0300 Subject: [PATCH] readme updated, some refactoring --- README.md | 53 +++++++++++++----- Tablet/TableDirector.swift | 25 ++++----- Tablet/TableRowBuilder.swift | 6 +- Tablet/Tablet.swift | 4 +- .../UserInterfaceState.xcuserstate | Bin 26304 -> 25546 bytes .../ConfigurableTableViewCell.swift | 2 +- .../TabletDemo/CustomTableActions.swift | 10 ++++ TabletDemo/TabletDemo/ViewController.swift | 4 ++ 8 files changed, 72 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index 72ea91a..23d35e5 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,9 @@ ![Tablet](https://raw.githubusercontent.com/maxsokolov/tablet/assets/tablet.png)

+Swift 2 compatible Platform iOS -Swift 2.1 compatible +CocoaPods compatible License: MIT

@@ -70,17 +71,17 @@ import Tablet class MyTableViewCell : UITableViewCell, ConfigurableCell { - typealias Item = User - - static func reusableIdentifier() -> String { - return "reusable_id" - } + typealias Item = User - func configureWithItem(item: Item) { // item is user here + static func reusableIdentifier() -> String { + return "reusable_id" + } - textLabel?.text = item.username + func configureWithItem(item: Item) { // item is user here + + textLabel?.text = item.username detailTextLabel?.text = item.isActive ? "Active" : "Inactive" - } + } } ``` Once you've implemented the protocol, simply use the `TableConfigurableRowBuilder` to build cells: @@ -107,10 +108,11 @@ let rowBuilder = TableRowBuilder(items: [user1, user2, us } .action(.click) { data in - + } - .action(.willDisplay) { data in - + .action(.shouldHighlight) { data in + + return false } ``` @@ -124,7 +126,7 @@ class MyTableViewCell : UITableViewCell { @IBAction func buttonClicked(sender: UIButton) { - Action(key: kMyAction, sender: self, userInfo: nil).trigger() + Action(key: kMyAction, sender: self, userInfo: nil).perform() } } ``` @@ -144,6 +146,31 @@ let rowBuilder = TableConfigurableRowBuilder(items: users } ``` +## Extensibility + +If you find that Tablet is not provide an action you need, for example you need UITableViewDelegate's `didEndDisplayingCell` method and it's not out of the box, +simply provide an extension for `TableDirector` as follow: +```swift +import Tablet + +let kTableDirectorDidEndDisplayingCell = "enddisplaycell" + +extension TableDirector { + + public func tableView(tableView: UITableView, didEndDisplayingCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { + + performAction(.custom(kTableDirectordidEndDisplayingCell), cell: cell, indexPath: indexPath) + } +} +``` +Catch your action with row builder: +```swift +let rowBuilder = TableConfigurableRowBuilder(items: users) + .action(kTableDirectordidEndDisplayingCell) { data in + + } +``` + ## License Tablet is available under the MIT license. See LICENSE for details. \ No newline at end of file diff --git a/Tablet/TableDirector.swift b/Tablet/TableDirector.swift index b8bb781..30c6daf 100644 --- a/Tablet/TableDirector.swift +++ b/Tablet/TableDirector.swift @@ -69,10 +69,10 @@ public class TableDirector: NSObject, UITableViewDataSource, UITableViewDelegate return sections[indexPath.section].builderAtIndex(indexPath.row)! } - public func triggerAction(action: ActionType, cell: UITableViewCell?, indexPath: NSIndexPath) -> AnyObject? { + public func performAction(action: ActionType, cell: UITableViewCell?, indexPath: NSIndexPath) -> AnyObject? { let builder = builderAtIndexPath(indexPath) - return builder.0.triggerAction(action, cell: cell, indexPath: indexPath, itemIndex: builder.1) + return builder.0.performAction(action, cell: cell, indexPath: indexPath, itemIndex: builder.1) } internal func didReceiveAction(notification: NSNotification) { @@ -80,7 +80,7 @@ public class TableDirector: NSObject, UITableViewDataSource, UITableViewDelegate if let action = notification.object as? Action, indexPath = tableView.indexPathForCell(action.cell) { let builder = builderAtIndexPath(indexPath) - builder.0.triggerAction(.custom(action.key), cell: action.cell, indexPath: indexPath, itemIndex: builder.1) + builder.0.performAction(.custom(action.key), cell: action.cell, indexPath: indexPath, itemIndex: builder.1) } } @@ -102,7 +102,7 @@ public class TableDirector: NSObject, UITableViewDataSource, UITableViewDelegate let cell = tableView.dequeueReusableCellWithIdentifier(builder.0.reusableIdentifier, forIndexPath: indexPath) - builder.0.triggerAction(.configure, cell: cell, indexPath: indexPath, itemIndex: builder.1) + builder.0.performAction(.configure, cell: cell, indexPath: indexPath, itemIndex: builder.1) return cell } @@ -155,34 +155,33 @@ extension TableDirector { } public func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { - - - return triggerAction(.height, cell: nil, indexPath: indexPath) as? CGFloat ?? UITableViewAutomaticDimension + + return performAction(.height, cell: nil, indexPath: indexPath) as? CGFloat ?? UITableViewAutomaticDimension } public func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { let cell = tableView.cellForRowAtIndexPath(indexPath) - if triggerAction(.click, cell: cell, indexPath: indexPath) != nil { + if performAction(.click, cell: cell, indexPath: indexPath) != nil { tableView.deselectRowAtIndexPath(indexPath, animated: true) } else { - triggerAction(.select, cell: cell, indexPath: indexPath) + performAction(.select, cell: cell, indexPath: indexPath) } } public func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) { - triggerAction(.deselect, cell: tableView.cellForRowAtIndexPath(indexPath), indexPath: indexPath) + performAction(.deselect, cell: tableView.cellForRowAtIndexPath(indexPath), indexPath: indexPath) } public func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { - - triggerAction(.willDisplay, cell: cell, indexPath: indexPath) + + performAction(.willDisplay, cell: cell, indexPath: indexPath) } public func tableView(tableView: UITableView, shouldHighlightRowAtIndexPath indexPath: NSIndexPath) -> Bool { - return triggerAction(.shouldHighlight, cell: tableView.cellForRowAtIndexPath(indexPath), indexPath: indexPath) as? Bool ?? true + return performAction(.shouldHighlight, cell: tableView.cellForRowAtIndexPath(indexPath), indexPath: indexPath) as? Bool ?? true } } \ No newline at end of file diff --git a/Tablet/TableRowBuilder.swift b/Tablet/TableRowBuilder.swift index a09de24..edd2854 100644 --- a/Tablet/TableRowBuilder.swift +++ b/Tablet/TableRowBuilder.swift @@ -107,7 +107,7 @@ public class TableRowBuilder : RowBuilder { // MARK: Triggers - public func triggerAction(actionType: ActionType, cell: UITableViewCell?, indexPath: NSIndexPath, itemIndex: Int) -> AnyObject? { + public func performAction(actionType: ActionType, cell: UITableViewCell?, indexPath: NSIndexPath, itemIndex: Int) -> AnyObject? { if let action = actions[actionType.key] { return action.call(ActionData(cell: cell as? C, indexPath: indexPath, item: items[itemIndex], itemIndex: itemIndex)) @@ -129,13 +129,13 @@ public class TableConfigurableRowBuilder AnyObject? { + public override func performAction(actionType: ActionType, cell: UITableViewCell?, indexPath: NSIndexPath, itemIndex: Int) -> AnyObject? { switch actionType { case .configure: (cell as? C)?.configureWithItem(items[itemIndex]) default: break } - return super.triggerAction(actionType, cell: cell, indexPath: indexPath, itemIndex: itemIndex) + return super.performAction(actionType, cell: cell, indexPath: indexPath, itemIndex: itemIndex) } } diff --git a/Tablet/Tablet.swift b/Tablet/Tablet.swift index 6ceeeaf..3331c53 100644 --- a/Tablet/Tablet.swift +++ b/Tablet/Tablet.swift @@ -86,7 +86,7 @@ public class Action { self.userInfo = userInfo } - public func trigger() { + public func perform() { NSNotificationCenter.defaultCenter().postNotificationName(kActionPerformedNotificationKey, object: self) } @@ -114,5 +114,5 @@ public protocol RowBuilder { var reusableIdentifier: String { get } var estimatedRowHeight: CGFloat { get } - func triggerAction(actionType: ActionType, cell: UITableViewCell?, indexPath: NSIndexPath, itemIndex: Int) -> AnyObject? + func performAction(actionType: ActionType, cell: UITableViewCell?, indexPath: NSIndexPath, itemIndex: Int) -> AnyObject? } \ No newline at end of file diff --git a/TabletDemo/TabletDemo.xcodeproj/project.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate b/TabletDemo/TabletDemo.xcodeproj/project.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate index 066f0b0a4d703d999d3f99688b8d56aebb1f6a56..fe7b4a04a38e9e02e3850aadfc1a2659c7d4146f 100644 GIT binary patch delta 8578 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 JF&O2&{vY!I<}v^P diff --git a/TabletDemo/TabletDemo/ConfigurableTableViewCell.swift b/TabletDemo/TabletDemo/ConfigurableTableViewCell.swift index a83405f..07be0a2 100644 --- a/TabletDemo/TabletDemo/ConfigurableTableViewCell.swift +++ b/TabletDemo/TabletDemo/ConfigurableTableViewCell.swift @@ -29,6 +29,6 @@ class ConfigurableTableViewCell: UITableViewCell, ConfigurableCell { @IBAction func buttonClicked(sender: UIButton) { - Action(key: kConfigurableTableViewCellButtonClickedAction, sender: self).trigger() + Action(key: kConfigurableTableViewCellButtonClickedAction, sender: self).perform() } } \ No newline at end of file diff --git a/TabletDemo/TabletDemo/CustomTableActions.swift b/TabletDemo/TabletDemo/CustomTableActions.swift index 3c55cd9..c586a75 100644 --- a/TabletDemo/TabletDemo/CustomTableActions.swift +++ b/TabletDemo/TabletDemo/CustomTableActions.swift @@ -8,3 +8,13 @@ import UIKit import Foundation + +let kTableDirectorDidEndDisplayingCell = "enddisplaycell" + +extension TableDirector { + + public func tableView(tableView: UITableView, didEndDisplayingCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { + + performAction(.custom(kTableDirectorDidEndDisplayingCell), cell: cell, indexPath: indexPath) + } +} \ No newline at end of file diff --git a/TabletDemo/TabletDemo/ViewController.swift b/TabletDemo/TabletDemo/ViewController.swift index 3638950..240941c 100644 --- a/TabletDemo/TabletDemo/ViewController.swift +++ b/TabletDemo/TabletDemo/ViewController.swift @@ -27,6 +27,10 @@ class ViewController: UIViewController { return false } + .action(kTableDirectorDidEndDisplayingCell) { data -> Void in + + print("end display: \(data.indexPath)") + } let configurableRowBuilder = TableConfigurableRowBuilder(items: ["5", "6", "7", "8"], estimatedRowHeight: 300) .action(.click) { data -> Void in