From f8c659f069fb3701ed2adbe1e68895aa34eab791 Mon Sep 17 00:00:00 2001 From: Max Sokolov Date: Fri, 13 Nov 2015 01:00:12 +0300 Subject: [PATCH] ActionHandler approach --- Tablet/TableRowBuilder.swift | 65 ++++++++++-------- Tablet/Tablet.swift | 47 +++---------- .../UserInterfaceState.xcuserstate | Bin 22937 -> 19550 bytes TabletDemo/TabletDemo/ViewController.swift | 20 ++++-- 4 files changed, 58 insertions(+), 74 deletions(-) diff --git a/Tablet/TableRowBuilder.swift b/Tablet/TableRowBuilder.swift index 2be9c07..6c3a27c 100644 --- a/Tablet/TableRowBuilder.swift +++ b/Tablet/TableRowBuilder.swift @@ -21,17 +21,29 @@ import UIKit import Foundation +internal enum ActionHandler { + + case actionBlock((data: ActionData) -> Void) + case actionReturnBlock((data: ActionData) -> AnyObject) + + func call(data: ActionData) -> AnyObject { + + switch (self) { + case .actionBlock(let closure): + closure(data: data) + return true + case .actionReturnBlock(let closure): + return closure(data: data) + } + } +} + /** Responsible for building cells of given type and passing items to them. */ public class TableRowBuilder : RowBuilder { - - public typealias ReturnValue = AnyObject - - public typealias TableRowBuilderActionBlock = (data: ActionData) -> Void - public typealias TableRowBuilderReturnValueActionBlock = (data: ActionData) -> ReturnValue - - private var actions = Dictionary() + + private var actions = Dictionary>() private var items = [I]() public var reusableIdentifier: String @@ -67,36 +79,33 @@ public class TableRowBuilder : RowBuilder { } // MARK: Chaining actions - - public func action(key: String, action: TableRowBuilderActionBlock) -> Self { - - actions[key] = action + + public func action(key: String, action: (data: ActionData) -> Void) -> Self { + + actions[key] = .actionBlock(action) return self } - public func action(key: ActionType, action: TableRowBuilderActionBlock) -> Self { - - actions[key.rawValue] = action + public func action(key: ActionType, action: (data: ActionData) -> Void) -> Self { + + actions[key.rawValue] = .actionBlock(action) return self } - public func action(key: ActionType, action: TableRowBuilderReturnValueActionBlock) -> Self { - - + public func action(key: ActionType, action: (data: ActionData) -> AnyObject) -> Self { + + actions[key.rawValue] = .actionReturnBlock(action) return self } // MARK: Triggers - public func triggerAction(key: String, cell: UITableViewCell, indexPath: NSIndexPath, itemIndex: Int) -> ActionResult { - - let actionData = ActionData(cell: cell as! C, indexPath: indexPath, item: items[itemIndex], itemIndex: itemIndex) - - if let block = actions[key] { - block(data: actionData) - return .Failure + public func triggerAction(key: String, cell: UITableViewCell?, indexPath: NSIndexPath, itemIndex: Int) -> AnyObject? { + + if let action = actions[key] { + return action.call(ActionData(cell: cell as? C, indexPath: indexPath, item: items[itemIndex], itemIndex: itemIndex)) } - return .Failure + return nil } } @@ -112,10 +121,10 @@ public class TableConfigurableRowBuilder ActionResult { + + public override func triggerAction(key: String, cell: UITableViewCell?, indexPath: NSIndexPath, itemIndex: Int) -> AnyObject? { - (cell as! C).configureWithItem(items[itemIndex]) + (cell as? C)?.configureWithItem(items[itemIndex]) return super.triggerAction(key, cell: cell, indexPath: indexPath, itemIndex: itemIndex) } diff --git a/Tablet/Tablet.swift b/Tablet/Tablet.swift index 15d7bb9..00035e0 100644 --- a/Tablet/Tablet.swift +++ b/Tablet/Tablet.swift @@ -39,12 +39,12 @@ public enum ActionType : String { public struct ActionData { - public let cell: C + public let cell: C? public let item: I public let itemIndex: Int public let indexPath: NSIndexPath - init(cell: C, indexPath: NSIndexPath, item: I, itemIndex: Int) { + init(cell: C?, indexPath: NSIndexPath, item: I, itemIndex: Int) { self.cell = cell self.indexPath = indexPath @@ -53,31 +53,6 @@ public struct ActionData { } } -public enum ActionResult { - - case Success(returnValue: AnyObject) - case Failure - - /// Returns true if the result is a success, false otherwise. - public var isSuccess: Bool { - switch self { - case .Success: - return true - case .Failure: - return false - } - } - - public var returnValue: AnyObject? { - switch self { - case .Success(let returnValue): - return returnValue - case .Failure: - return nil - } - } -} - /** A custom action that you can trigger from your cell. You can eacily catch actions using a chaining manner with your row builder. @@ -127,10 +102,9 @@ public protocol RowBuilder { var numberOfRows: Int { get } var reusableIdentifier: String { get } - func triggerAction(key: String, cell: UITableViewCell, indexPath: NSIndexPath, itemIndex: Int) -> ActionResult + func triggerAction(key: String, cell: UITableViewCell?, indexPath: NSIndexPath, itemIndex: Int) -> AnyObject? } - /** Responsible for table view's datasource and delegate. */ @@ -179,17 +153,12 @@ public class TableDirector: NSObject, UITableViewDataSource, UITableViewDelegate return sections[indexPath.section].builderAtIndex(indexPath.row)! } - private func triggerAction(action: ActionType, cell: UITableViewCell?, indexPath: NSIndexPath) -> ActionResult { + private func triggerAction(action: ActionType, cell: UITableViewCell?, indexPath: NSIndexPath) -> AnyObject? { let builder = builderAtIndexPath(indexPath) - return builder.0.triggerAction(action.rawValue, cell: cell!, indexPath: indexPath, itemIndex: builder.1) + return builder.0.triggerAction(action.rawValue, cell: cell, indexPath: indexPath, itemIndex: builder.1) } - - private func trigger() -> AnyObject { - return 100 - } - internal func didReceiveAction(notification: NSNotification) { if let action = notification.object as? Action, indexPath = tableView.indexPathForCell(action.cell) { @@ -262,7 +231,7 @@ public class TableDirector: NSObject, UITableViewDataSource, UITableViewDelegate let cell = tableView.cellForRowAtIndexPath(indexPath) - if triggerAction(.click, cell: cell, indexPath: indexPath).isSuccess { + if triggerAction(.click, cell: cell, indexPath: indexPath) != nil { tableView.deselectRowAtIndexPath(indexPath, animated: true) } else { triggerAction(.select, cell: cell, indexPath: indexPath) @@ -281,11 +250,11 @@ public class TableDirector: NSObject, UITableViewDataSource, UITableViewDelegate public func tableView(tableView: UITableView, shouldHighlightRowAtIndexPath indexPath: NSIndexPath) -> Bool { - return triggerAction(.shouldHighlight, cell: tableView.cellForRowAtIndexPath(indexPath), indexPath: indexPath).returnValue as? Bool ?? true + return triggerAction(.shouldHighlight, cell: tableView.cellForRowAtIndexPath(indexPath), indexPath: indexPath) as? Bool ?? true } public func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { - return triggerAction(.height, cell: tableView.cellForRowAtIndexPath(indexPath), indexPath: indexPath).returnValue as? CGFloat ?? tableView.rowHeight + return triggerAction(.height, cell: nil, indexPath: indexPath) as? CGFloat ?? tableView.rowHeight } } \ 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 e703eba5a373b116ab59d025e0486ecf495261a9..4169e6efacb8dc7a04433b2f062c0fa4186df192 100644 GIT binary patch literal 19550 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 zareXBk97a0`?uu<(items: [1, 2, 3, 4], id: "cell") - .action(.configure) { data in + .action(.configure) { data -> Void in - data.cell.textLabel?.text = "\(data.item)" + data.cell?.textLabel?.text = "\(data.item)" } - .action(.shouldHighlight) { _ in + .action(.height) { data in + + return 50 + } + .action(.shouldHighlight) { data in return false } - + let configurableRowBuilder = TableConfigurableRowBuilder(items: ["5", "6", "7", "8"]) - .action(kConfigurableTableViewCellButtonClickedAction) { data in + .action(kConfigurableTableViewCellButtonClickedAction) { data -> Void in print("custom action indexPath: \(data.indexPath), item: \(data.item)") } - .action(.click) { data in - + .action(.click) { data -> Void in + + data.cell!.textLabel?.text = "" + print("custom action indexPath: \(data.indexPath), item: \(data.item)") }