From 4bcd3a12582a4912aece19f5d2b61593dd41e8ef Mon Sep 17 00:00:00 2001 From: Max Sokolov Date: Sun, 20 Mar 2016 20:57:03 +0300 Subject: [PATCH] code improvements --- .../UserInterfaceState.xcuserstate | Bin 15819 -> 15980 bytes Tablet/TableDirector.swift | 38 +++++-------- Tablet/TableRowBuilder.swift | 4 +- Tablet/TableSectionBuilder.swift | 50 +++++++++--------- Tablet/Tablet.swift | 1 - 5 files changed, 40 insertions(+), 53 deletions(-) diff --git a/Tablet.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate b/Tablet.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate index 7edcc6accdff2932934599edf31da711b7bb9439..f0bb5b7c3e78dd532a067cc5a318db7a70ccae03 100644 GIT binary patch delta 8067 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 V{6B-Ce>YTq*j`ol*Vm-U{}0B+dSCzm delta 7960 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 Zdisy)ztsK}fkUY7&iAUjKe(p<_J4s4CJF!m diff --git a/Tablet/TableDirector.swift b/Tablet/TableDirector.swift index 1c5013d..d50bd79 100644 --- a/Tablet/TableDirector.swift +++ b/Tablet/TableDirector.swift @@ -29,7 +29,7 @@ public class TableDirector: NSObject, UITableViewDataSource, UITableViewDelegate public private(set) weak var tableView: UITableView! public weak var scrollDelegate: UIScrollViewDelegate? private var sections = [TableSectionBuilder]() - + public init(tableView: UITableView) { super.init() @@ -56,24 +56,16 @@ public class TableDirector: NSObject, UITableViewDataSource, UITableViewDelegate - Returns: A touple - (builder, builderItemIndex) */ private func builderAtIndexPath(indexPath: NSIndexPath) -> (RowBuilder, Int) { - return sections[indexPath.section].builderAtIndex(indexPath.row)! } + // MARK: Public + public func invokeAction(action: ActionType, cell: UITableViewCell?, indexPath: NSIndexPath) -> AnyObject? { let builder = builderAtIndexPath(indexPath) return builder.0.invokeAction(action, cell: cell, indexPath: indexPath, itemIndex: builder.1, userInfo: nil) } - - internal func didReceiveAction(notification: NSNotification) { - - if let action = notification.object as? Action, indexPath = tableView.indexPathForCell(action.cell) { - - let builder = builderAtIndexPath(indexPath) - builder.0.invokeAction(.custom(action.key), cell: action.cell, indexPath: indexPath, itemIndex: builder.1, userInfo: notification.userInfo) - } - } public override func respondsToSelector(selector: Selector) -> Bool { return super.respondsToSelector(selector) || scrollDelegate?.respondsToSelector(selector) == true @@ -82,6 +74,17 @@ public class TableDirector: NSObject, UITableViewDataSource, UITableViewDelegate public override func forwardingTargetForSelector(selector: Selector) -> AnyObject? { return scrollDelegate?.respondsToSelector(selector) == true ? scrollDelegate : super.forwardingTargetForSelector(selector) } + + // MARK: Internal + + func didReceiveAction(notification: NSNotification) { + + if let action = notification.object as? Action, indexPath = tableView.indexPathForCell(action.cell) { + + let builder = builderAtIndexPath(indexPath) + builder.0.invokeAction(.custom(action.key), cell: action.cell, indexPath: indexPath, itemIndex: builder.1, userInfo: notification.userInfo) + } + } } public extension TableDirector { @@ -89,12 +92,10 @@ public extension TableDirector { // MARK: UITableViewDataSource - configuration func numberOfSectionsInTableView(tableView: UITableView) -> Int { - return sections.count } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return sections[section].numberOfRowsInSection } @@ -120,34 +121,28 @@ public extension TableDirector { // MARK: UITableViewDataSource - section setup func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { - return sections[section].headerTitle } func tableView(tableView: UITableView, titleForFooterInSection section: Int) -> String? { - return sections[section].footerTitle } // MARK: UITableViewDelegate - section setup func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { - return sections[section].headerView } func tableView(tableView: UITableView, viewForFooterInSection section: Int) -> UIView? { - return sections[section].footerView } func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { - return sections[section].headerHeight } func tableView(tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { - return sections[section].footerHeight } } @@ -157,12 +152,10 @@ public extension TableDirector { // MARK: UITableViewDelegate - actions func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { - return CGFloat(builderAtIndexPath(indexPath).0.estimatedRowHeight) } func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { - return invokeAction(.height, cell: nil, indexPath: indexPath) as? CGFloat ?? UITableViewAutomaticDimension } @@ -183,17 +176,14 @@ public extension TableDirector { } func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) { - invokeAction(.deselect, cell: tableView.cellForRowAtIndexPath(indexPath), indexPath: indexPath) } func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { - invokeAction(.willDisplay, cell: cell, indexPath: indexPath) } func tableView(tableView: UITableView, shouldHighlightRowAtIndexPath indexPath: NSIndexPath) -> Bool { - return invokeAction(.shouldHighlight, cell: tableView.cellForRowAtIndexPath(indexPath), indexPath: indexPath) as? Bool ?? true } } diff --git a/Tablet/TableRowBuilder.swift b/Tablet/TableRowBuilder.swift index 567c3fe..6641c8d 100644 --- a/Tablet/TableRowBuilder.swift +++ b/Tablet/TableRowBuilder.swift @@ -109,8 +109,8 @@ public class TableRowBuilder : RowBuilder { actions[actionType.key] = .actionReturnBlock(closure) return self } - - // MARK: Triggers + + // MARK: Internal override func invokeAction(actionType: ActionType, cell: UITableViewCell?, indexPath: NSIndexPath, itemIndex: Int, userInfo: [NSObject: AnyObject]?) -> AnyObject? { diff --git a/Tablet/TableSectionBuilder.swift b/Tablet/TableSectionBuilder.swift index 5bfe19c..57a2f3b 100644 --- a/Tablet/TableSectionBuilder.swift +++ b/Tablet/TableSectionBuilder.swift @@ -27,7 +27,7 @@ import Foundation */ public class TableSectionBuilder { - internal weak var tableView: UITableView? + weak var tableView: UITableView? private var builders = [RowBuilder]() public var headerTitle: String? @@ -38,10 +38,9 @@ public class TableSectionBuilder { public var footerView: UIView? public var footerHeight: CGFloat = UITableViewAutomaticDimension - + /// A total number of rows in section of each row builder. public var numberOfRowsInSection: Int { - return builders.reduce(0) { $0 + $1.numberOfRows } } @@ -63,29 +62,8 @@ public class TableSectionBuilder { self.footerView = footerView self.footerHeight = footerHeight } -} -internal extension TableSectionBuilder { - - internal func builderAtIndex(var index: Int) -> (RowBuilder, Int)? { - - for builder in builders { - if index < builder.numberOfRows { - return (builder, index) - } - index -= builder.numberOfRows - } - - return nil - } - - internal func willMoveToDirector(tableView: UITableView) { - self.tableView = tableView - self.builders.forEach { $0.registerCell(inTableView: tableView) } - } -} - -public extension TableSectionBuilder { + // MARK: Public public func clear() { builders.removeAll() @@ -96,10 +74,30 @@ public extension TableSectionBuilder { } public func appendRows(rowBuilders: [RowBuilder]) { - + if let tableView = tableView { rowBuilders.forEach { $0.registerCell(inTableView: tableView) } } builders.appendContentsOf(rowBuilders) } + + // MARK: Internal + + func builderAtIndex(var index: Int) -> (RowBuilder, Int)? { + + for builder in builders { + if index < builder.numberOfRows { + return (builder, index) + } + index -= builder.numberOfRows + } + + return nil + } + + func willMoveToDirector(tableView: UITableView) { + + self.tableView = tableView + self.builders.forEach { $0.registerCell(inTableView: tableView) } + } } public func +=(left: TableSectionBuilder, right: RowBuilder) { diff --git a/Tablet/Tablet.swift b/Tablet/Tablet.swift index 9c344d0..0cfc919 100644 --- a/Tablet/Tablet.swift +++ b/Tablet/Tablet.swift @@ -92,7 +92,6 @@ public class Action { } public func invoke() { - NSNotificationCenter.defaultCenter().postNotificationName(TabletNotifications.CellAction, object: self, userInfo: userInfo) } }