From 4a9ed7f4ff1fed1c5a431727a521b3ce8d9f8215 Mon Sep 17 00:00:00 2001 From: Max Sokolov Date: Sun, 21 Feb 2016 13:20:58 +0300 Subject: [PATCH 01/18] move estimated height from builder to cell --- Tablet/TableDirector.swift | 2 +- Tablet/TableRowBuilder.swift | 24 ++++++++++-------- Tablet/Tablet.swift | 3 ++- .../UserInterfaceState.xcuserstate | Bin 29425 -> 29723 bytes .../ConfigurableTableViewCell.swift | 6 ++++- TabletDemo/TabletDemo/ViewController.swift | 8 +++--- 6 files changed, 26 insertions(+), 17 deletions(-) diff --git a/Tablet/TableDirector.swift b/Tablet/TableDirector.swift index 957b933..932592a 100644 --- a/Tablet/TableDirector.swift +++ b/Tablet/TableDirector.swift @@ -158,7 +158,7 @@ public extension TableDirector { func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { - return builderAtIndexPath(indexPath).0.estimatedRowHeight + return CGFloat(builderAtIndexPath(indexPath).0.estimatedRowHeight) } func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { diff --git a/Tablet/TableRowBuilder.swift b/Tablet/TableRowBuilder.swift index d3a3b8b..e9889bc 100644 --- a/Tablet/TableRowBuilder.swift +++ b/Tablet/TableRowBuilder.swift @@ -49,24 +49,24 @@ public class TableRowBuilder : RowBuilder { private var items = [I]() public var reusableIdentifier: String - public var estimatedRowHeight: CGFloat + public var estimatedRowHeight: Float { + return 44 + } public var numberOfRows: Int { get { return items.count } } - public init(item: I, id: String? = nil, estimatedRowHeight: CGFloat) { + public init(item: I, id: String? = nil) { reusableIdentifier = id ?? NSStringFromClass(C).componentsSeparatedByString(".").last ?? "" - self.estimatedRowHeight = estimatedRowHeight items.append(item) } - public init(items: [I]? = nil, id: String? = nil, estimatedRowHeight: CGFloat) { + public init(items: [I]? = nil, id: String? = nil) { reusableIdentifier = id ?? NSStringFromClass(C).componentsSeparatedByString(".").last ?? "" - self.estimatedRowHeight = estimatedRowHeight if items != nil { self.items.appendContentsOf(items!) @@ -128,13 +128,17 @@ public class TableRowBuilder : RowBuilder { Responsible for building configurable cells of given type and passing items to them. */ public class TableConfigurableRowBuilder : TableRowBuilder { - - public init(item: I, estimatedRowHeight: CGFloat) { - super.init(item: item, id: C.reusableIdentifier(), estimatedRowHeight: estimatedRowHeight) + + public override var estimatedRowHeight: Float { + return C.estimatedHeight() } - public init(items: [I]? = nil, estimatedRowHeight: CGFloat) { - super.init(items: items, id: C.reusableIdentifier(), estimatedRowHeight: estimatedRowHeight) + public init(item: I) { + super.init(item: item, id: C.reusableIdentifier()) + } + + public init(items: [I]? = nil) { + super.init(items: items, id: C.reusableIdentifier()) } public override func invokeAction(actionType: ActionType, cell: UITableViewCell?, indexPath: NSIndexPath, itemIndex: Int, userInfo: [NSObject: AnyObject]? = nil) -> AnyObject? { diff --git a/Tablet/Tablet.swift b/Tablet/Tablet.swift index ce40387..e287852 100644 --- a/Tablet/Tablet.swift +++ b/Tablet/Tablet.swift @@ -102,6 +102,7 @@ public protocol ConfigurableCell { typealias Item static func reusableIdentifier() -> String + static func estimatedHeight() -> Float func configureWithItem(item: Item) } @@ -121,7 +122,7 @@ public protocol RowBuilder { var numberOfRows: Int { get } var reusableIdentifier: String { get } - var estimatedRowHeight: CGFloat { get } + var estimatedRowHeight: Float { get } func registerCell(inTableView tableView: UITableView) func invokeAction(actionType: ActionType, cell: UITableViewCell?, indexPath: NSIndexPath, itemIndex: Int, userInfo: [NSObject: AnyObject]?) -> AnyObject? 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 da29aef83ea55590b225fc96c709c1339540abd8..17fa8b223c29db04e7bfbac245cea23a81b6551c 100644 GIT binary patch delta 14736 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 mm5(ojlRTP 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 Float { + return 300 + } func configureWithItem(item: Item) { button.setTitle("Button \(item)", forState: .Normal) } - + @IBAction func buttonClicked(sender: UIButton) { Action(key: kConfigurableTableViewCellButtonClickedAction, sender: self).invoke() diff --git a/TabletDemo/TabletDemo/ViewController.swift b/TabletDemo/TabletDemo/ViewController.swift index 50d971f..fa02d6c 100644 --- a/TabletDemo/TabletDemo/ViewController.swift +++ b/TabletDemo/TabletDemo/ViewController.swift @@ -19,7 +19,7 @@ class ViewController: UIViewController, UIScrollViewDelegate { tableDirector = TableDirector(tableView: tableView) tableDirector.scrollDelegate = self - let rowBuilder = TableRowBuilder(items: [1, 2, 3, 4], id: "cell", estimatedRowHeight: 44) + let rowBuilder = TableRowBuilder(items: [1, 2, 3, 4], id: "cell") .action(.configure) { data in data.cell?.textLabel?.text = "\(data.item)" @@ -34,7 +34,7 @@ class ViewController: UIViewController, UIScrollViewDelegate { } - let configurableRowBuilder = TableConfigurableRowBuilder(items: ["5", "6", "7", "8"], estimatedRowHeight: 300) + let configurableRowBuilder = TableConfigurableRowBuilder(items: ["5", "6", "7", "8"]) .action(.click) { data -> Void in print("click action indexPath: \(data.indexPath), item: \(data.item)") @@ -55,13 +55,13 @@ class ViewController: UIViewController, UIScrollViewDelegate { data.cell!.contentLabel.text = "Tablet is a super lightweight yet powerful generic library that handles a complexity of UITableView's datasource and delegate methods in a Swift environment. Tablet's goal is to provide an easiest way to create complex table views. With Tablet you don't have to write a messy code of switch or if statements when you deal with bunch of different cells in different sections." } - let myRowBuilder = TableRowBuilder(item: 0, id: "cellll", estimatedRowHeight: 44) + let myRowBuilder = TableRowBuilder(item: 0, id: "cellll") let sectionBuilder = TableSectionBuilder(headerTitle: "Tablet", footerTitle: "Deal with table view like a boss.", rowBuilders: [rowBuilder, configurableRowBuilder, myRowBuilder]) tableDirector += sectionBuilder - sectionBuilder.appendRowBuilder(TableRowBuilder(item: 0, estimatedRowHeight: 44)) + sectionBuilder.appendRowBuilder(TableRowBuilder(item: 0)) } func scrollViewWillBeginDragging(scrollView: UIScrollView) { From 5ac120da0c0111798bb065ec9b04b3947e118306 Mon Sep 17 00:00:00 2001 From: Max Sokolov Date: Sat, 19 Mar 2016 09:42:51 +0300 Subject: [PATCH 02/18] minor improvements --- README.md | 2 +- Tablet.podspec | 2 +- Tablet/TableDirector.swift | 12 ++++-------- Tablet/TableRowBuilder.swift | 3 +++ Tablet/TableSectionBuilder.swift | 18 +++++++----------- Tablet/Tablet.swift | 6 ++++-- .../UserInterfaceState.xcuserstate | Bin 29723 -> 29385 bytes TabletDemo/TabletDemo/ViewController.swift | 14 ++++++++------ 8 files changed, 28 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index 84a933e..d6086ef 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@

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

diff --git a/Tablet.podspec b/Tablet.podspec index 5ab2bfc..c285709 100644 --- a/Tablet.podspec +++ b/Tablet.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'Tablet' - s.version = '0.2.5' + s.version = '0.3.0' s.homepage = 'https://github.com/maxsokolov/tablet' s.summary = 'Powerful type-safe tool for UITableView. Swift 2.0 is required.' diff --git a/Tablet/TableDirector.swift b/Tablet/TableDirector.swift index 932592a..74bd1f2 100644 --- a/Tablet/TableDirector.swift +++ b/Tablet/TableDirector.swift @@ -37,7 +37,7 @@ public class TableDirector: NSObject, UITableViewDataSource, UITableViewDelegate self.tableView.delegate = self self.tableView.dataSource = self - NSNotificationCenter.defaultCenter().addObserver(self, selector: "didReceiveAction:", name: kActionPerformedNotificationKey, object: nil) + NSNotificationCenter.defaultCenter().addObserver(self, selector: "didReceiveAction:", name: TabletNotifications.CellAction, object: nil) } deinit { @@ -168,7 +168,7 @@ public extension TableDirector { func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? { - return invokeAction(.willSelect, cell: tableView.cellForRowAtIndexPath(indexPath), indexPath: indexPath) as? NSIndexPath ?? indexPath + return invokeAction(.willSelect, cell: tableView.cellForRowAtIndexPath(indexPath), indexPath: indexPath) as? NSIndexPath } func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { @@ -218,21 +218,17 @@ public extension TableDirector { } public func +=(left: TableDirector, right: RowBuilder) { - - left.appendSection(TableSectionBuilder(rowBuilders: [right])) + left.appendSection(TableSectionBuilder(rows: [right])) } public func +=(left: TableDirector, right: [RowBuilder]) { - - left.appendSection(TableSectionBuilder(rowBuilders: right)) + left.appendSection(TableSectionBuilder(rows: right)) } public func +=(left: TableDirector, right: TableSectionBuilder) { - left.appendSection(right) } public func +=(left: TableDirector, right: [TableSectionBuilder]) { - left.appendSections(right) } \ No newline at end of file diff --git a/Tablet/TableRowBuilder.swift b/Tablet/TableRowBuilder.swift index e9889bc..fcf8b8c 100644 --- a/Tablet/TableRowBuilder.swift +++ b/Tablet/TableRowBuilder.swift @@ -130,14 +130,17 @@ public class TableRowBuilder : RowBuilder { public class TableConfigurableRowBuilder : TableRowBuilder { public override var estimatedRowHeight: Float { + return C.estimatedHeight() } public init(item: I) { + super.init(item: item, id: C.reusableIdentifier()) } public init(items: [I]? = nil) { + super.init(items: items, id: C.reusableIdentifier()) } diff --git a/Tablet/TableSectionBuilder.swift b/Tablet/TableSectionBuilder.swift index 5912ff0..5bfe19c 100644 --- a/Tablet/TableSectionBuilder.swift +++ b/Tablet/TableSectionBuilder.swift @@ -45,12 +45,12 @@ public class TableSectionBuilder { return builders.reduce(0) { $0 + $1.numberOfRows } } - public init(headerTitle: String? = nil, footerTitle: String? = nil, rowBuilders: [RowBuilder]? = nil) { + public init(headerTitle: String? = nil, footerTitle: String? = nil, rows: [RowBuilder]? = nil) { self.headerTitle = headerTitle self.footerTitle = footerTitle - if let initialRows = rowBuilders { + if let initialRows = rows { builders.appendContentsOf(initialRows) } } @@ -88,16 +88,14 @@ internal extension TableSectionBuilder { public extension TableSectionBuilder { public func clear() { - builders.removeAll() } - public func appendRowBuilder(rowBuilder: RowBuilder) { - - appendRowBuilders([rowBuilder]) + public func appendRow(row: RowBuilder) { + appendRows([row]) } - public func appendRowBuilders(rowBuilders: [RowBuilder]) { + public func appendRows(rowBuilders: [RowBuilder]) { if let tableView = tableView { rowBuilders.forEach { $0.registerCell(inTableView: tableView) } } builders.appendContentsOf(rowBuilders) @@ -105,11 +103,9 @@ public extension TableSectionBuilder { } public func +=(left: TableSectionBuilder, right: RowBuilder) { - - left.appendRowBuilder(right) + left.appendRow(right) } public func +=(left: TableSectionBuilder, right: [RowBuilder]) { - - left.appendRowBuilders(right) + left.appendRows(right) } \ No newline at end of file diff --git a/Tablet/Tablet.swift b/Tablet/Tablet.swift index e287852..a4ceb60 100644 --- a/Tablet/Tablet.swift +++ b/Tablet/Tablet.swift @@ -21,7 +21,9 @@ import UIKit import Foundation -internal let kActionPerformedNotificationKey = "_action" +internal struct TabletNotifications { + static let CellAction = "_cellaction" +} /** The actions that Tablet provides. @@ -89,7 +91,7 @@ public class Action { public func invoke() { - NSNotificationCenter.defaultCenter().postNotificationName(kActionPerformedNotificationKey, object: self) + NSNotificationCenter.defaultCenter().postNotificationName(TabletNotifications.CellAction, object: self) } } 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 17fa8b223c29db04e7bfbac245cea23a81b6551c..9bdfddebe6679c2a4fd4715cb930f586e2c35a35 100644 GIT binary patch delta 15339 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 G;{O9$;;XX& diff --git a/TabletDemo/TabletDemo/ViewController.swift b/TabletDemo/TabletDemo/ViewController.swift index fa02d6c..805aad2 100644 --- a/TabletDemo/TabletDemo/ViewController.swift +++ b/TabletDemo/TabletDemo/ViewController.swift @@ -10,13 +10,16 @@ import UIKit class ViewController: UIViewController, UIScrollViewDelegate { - @IBOutlet weak var tableView: UITableView! + @IBOutlet weak var tableView: UITableView! { + didSet { + tableDirector = TableDirector(tableView: tableView) + } + } var tableDirector: TableDirector! override func viewDidLoad() { super.viewDidLoad() - tableDirector = TableDirector(tableView: tableView) tableDirector.scrollDelegate = self let rowBuilder = TableRowBuilder(items: [1, 2, 3, 4], id: "cell") @@ -33,7 +36,6 @@ class ViewController: UIViewController, UIScrollViewDelegate { print("end display: \(data.indexPath)") } - let configurableRowBuilder = TableConfigurableRowBuilder(items: ["5", "6", "7", "8"]) .action(.click) { data -> Void in @@ -50,18 +52,18 @@ class ViewController: UIViewController, UIScrollViewDelegate { } return nil } - .action(.configure) { (data) -> Void in + .action(.configure) { data -> Void in data.cell!.contentLabel.text = "Tablet is a super lightweight yet powerful generic library that handles a complexity of UITableView's datasource and delegate methods in a Swift environment. Tablet's goal is to provide an easiest way to create complex table views. With Tablet you don't have to write a messy code of switch or if statements when you deal with bunch of different cells in different sections." } let myRowBuilder = TableRowBuilder(item: 0, id: "cellll") - let sectionBuilder = TableSectionBuilder(headerTitle: "Tablet", footerTitle: "Deal with table view like a boss.", rowBuilders: [rowBuilder, configurableRowBuilder, myRowBuilder]) + let sectionBuilder = TableSectionBuilder(headerTitle: "Tablet", footerTitle: "Deal with table view like a boss.", rows: [rowBuilder, configurableRowBuilder, myRowBuilder]) tableDirector += sectionBuilder - sectionBuilder.appendRowBuilder(TableRowBuilder(item: 0)) + sectionBuilder.appendRow(TableRowBuilder(item: 0)) } func scrollViewWillBeginDragging(scrollView: UIScrollView) { From 0fefdecac08e7b03cd80e27583eec97a15b597e9 Mon Sep 17 00:00:00 2001 From: Max Sokolov Date: Sat, 19 Mar 2016 15:17:43 +0300 Subject: [PATCH 03/18] setup project for tests --- Tablet.xcworkspace/contents.xcworkspacedata | 4 + .../UserInterfaceState.xcuserstate | Bin 0 -> 5070 bytes Tablet/Info.plist | 26 ++ Tablet/TableDirector.swift | 6 +- Tablet/TableRowBuilder.swift | 2 +- Tablet/Tablet.h | 12 + Tablet/Tablet.swift | 2 +- Tablet/Tablet.xcodeproj/project.pbxproj | 423 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../UserInterfaceState.xcuserstate | Bin 0 -> 40699 bytes .../xcschemes/Tablet.xcscheme | 99 ++++ .../xcschemes/xcschememanagement.plist | 27 ++ .../Application}/AppDelegate.swift | 0 .../ViewControllers/MainViewController.swift | 28 ++ .../Storyboards}/LaunchScreen.storyboard | 0 .../Storyboards}/Main.storyboard | 61 ++- .../TabletDemo.xcodeproj/project.pbxproj | 223 +++++++-- .../UserInterfaceState.xcuserstate | Bin 29385 -> 89586 bytes .../xcschemes/TabletDemo.xcscheme | 10 + .../xcschemes/xcschememanagement.plist | 5 + .../ConfigurableTableViewCell.swift | 1 + TabletDemo/TabletDemo/ViewController.swift | 2 +- Tests/Info.plist | 24 + Tests/TabletTests.swift | 47 ++ 24 files changed, 960 insertions(+), 49 deletions(-) create mode 100644 Tablet.xcworkspace/contents.xcworkspacedata create mode 100644 Tablet.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 Tablet/Info.plist create mode 100644 Tablet/Tablet.h create mode 100644 Tablet/Tablet.xcodeproj/project.pbxproj create mode 100644 Tablet/Tablet.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Tablet/Tablet.xcodeproj/project.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 Tablet/Tablet.xcodeproj/xcuserdata/maxsokolov.xcuserdatad/xcschemes/Tablet.xcscheme create mode 100644 Tablet/Tablet.xcodeproj/xcuserdata/maxsokolov.xcuserdatad/xcschemes/xcschememanagement.plist rename TabletDemo/{TabletDemo => Classes/Application}/AppDelegate.swift (100%) create mode 100644 TabletDemo/Classes/Presentation/Main/ViewControllers/MainViewController.swift rename TabletDemo/{TabletDemo/Base.lproj => Resources/Storyboards}/LaunchScreen.storyboard (100%) rename TabletDemo/{TabletDemo/Base.lproj => Resources/Storyboards}/Main.storyboard (75%) create mode 100644 Tests/Info.plist create mode 100644 Tests/TabletTests.swift diff --git a/Tablet.xcworkspace/contents.xcworkspacedata b/Tablet.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..94b2795 --- /dev/null +++ b/Tablet.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,4 @@ + + + diff --git a/Tablet.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate b/Tablet.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..145551c86c5bbea553b0d8bf8f1903b94b2bfc76 GIT binary patch literal 5070 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 + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/Tablet/TableDirector.swift b/Tablet/TableDirector.swift index 74bd1f2..d681cda 100644 --- a/Tablet/TableDirector.swift +++ b/Tablet/TableDirector.swift @@ -27,8 +27,8 @@ import Foundation public class TableDirector: NSObject, UITableViewDataSource, UITableViewDelegate { public private(set) weak var tableView: UITableView! - private var sections = [TableSectionBuilder]() public weak var scrollDelegate: UIScrollViewDelegate? + private var sections = [TableSectionBuilder]() public init(tableView: UITableView) { super.init() @@ -166,10 +166,10 @@ public extension TableDirector { return invokeAction(.height, cell: nil, indexPath: indexPath) as? CGFloat ?? UITableViewAutomaticDimension } - func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? { + /*func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? { return invokeAction(.willSelect, cell: tableView.cellForRowAtIndexPath(indexPath), indexPath: indexPath) as? NSIndexPath - } + }*/ func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { diff --git a/Tablet/TableRowBuilder.swift b/Tablet/TableRowBuilder.swift index fcf8b8c..970989e 100644 --- a/Tablet/TableRowBuilder.swift +++ b/Tablet/TableRowBuilder.swift @@ -23,7 +23,7 @@ import Foundation public typealias ReturnValue = AnyObject? -internal enum ActionHandler { +enum ActionHandler { case actionBlock((data: ActionData) -> Void) case actionReturnBlock((data: ActionData) -> AnyObject?) diff --git a/Tablet/Tablet.h b/Tablet/Tablet.h new file mode 100644 index 0000000..a1d2602 --- /dev/null +++ b/Tablet/Tablet.h @@ -0,0 +1,12 @@ +// +// Tablet.h +// Tablet +// +// Created by Max Sokolov on 19/03/16. +// Copyright © 2016 Tablet. All rights reserved. +// + +@import Foundation; + +FOUNDATION_EXPORT double TabletVersionNumber; +FOUNDATION_EXPORT const unsigned char TabletVersionString[]; \ No newline at end of file diff --git a/Tablet/Tablet.swift b/Tablet/Tablet.swift index a4ceb60..0e71508 100644 --- a/Tablet/Tablet.swift +++ b/Tablet/Tablet.swift @@ -21,7 +21,7 @@ import UIKit import Foundation -internal struct TabletNotifications { +struct TabletNotifications { static let CellAction = "_cellaction" } diff --git a/Tablet/Tablet.xcodeproj/project.pbxproj b/Tablet/Tablet.xcodeproj/project.pbxproj new file mode 100644 index 0000000..f178aa9 --- /dev/null +++ b/Tablet/Tablet.xcodeproj/project.pbxproj @@ -0,0 +1,423 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + DAC2D6741C9D743D009E9C19 /* Tablet.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DAC2D6691C9D743D009E9C19 /* Tablet.framework */; }; + DAC2D6871C9D7517009E9C19 /* Tablet.h in Headers */ = {isa = PBXBuildFile; fileRef = DAC2D6851C9D7517009E9C19 /* Tablet.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DAC2D6901C9D799E009E9C19 /* TableDirector.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC2D68C1C9D799E009E9C19 /* TableDirector.swift */; }; + DAC2D6911C9D799E009E9C19 /* TableRowBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC2D68D1C9D799E009E9C19 /* TableRowBuilder.swift */; }; + DAC2D6921C9D799E009E9C19 /* TableSectionBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC2D68E1C9D799E009E9C19 /* TableSectionBuilder.swift */; }; + DAC2D6931C9D799E009E9C19 /* Tablet.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC2D68F1C9D799E009E9C19 /* Tablet.swift */; }; + DAC2D6991C9D7A3F009E9C19 /* TabletTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC2D6961C9D7A3B009E9C19 /* TabletTests.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + DAC2D6751C9D743D009E9C19 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DAC2D6601C9D743D009E9C19 /* Project object */; + proxyType = 1; + remoteGlobalIDString = DAC2D6681C9D743D009E9C19; + remoteInfo = Tablet; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + DAC2D6691C9D743D009E9C19 /* Tablet.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Tablet.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + DAC2D6731C9D743D009E9C19 /* TabletTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TabletTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + DAC2D6841C9D7517009E9C19 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + DAC2D6851C9D7517009E9C19 /* Tablet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Tablet.h; sourceTree = ""; }; + DAC2D68C1C9D799E009E9C19 /* TableDirector.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableDirector.swift; sourceTree = ""; }; + DAC2D68D1C9D799E009E9C19 /* TableRowBuilder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableRowBuilder.swift; sourceTree = ""; }; + DAC2D68E1C9D799E009E9C19 /* TableSectionBuilder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableSectionBuilder.swift; sourceTree = ""; }; + DAC2D68F1C9D799E009E9C19 /* Tablet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Tablet.swift; sourceTree = ""; }; + DAC2D6951C9D7A3B009E9C19 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + DAC2D6961C9D7A3B009E9C19 /* TabletTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TabletTests.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + DAC2D6651C9D743D009E9C19 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DAC2D6701C9D743D009E9C19 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + DAC2D6741C9D743D009E9C19 /* Tablet.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + DAC2D65F1C9D743D009E9C19 = { + isa = PBXGroup; + children = ( + DAC2D68B1C9D7990009E9C19 /* Classes */, + DAC2D6941C9D7A03009E9C19 /* Tests */, + DAC2D6831C9D74EE009E9C19 /* Supporting Files */, + DAC2D66A1C9D743D009E9C19 /* Products */, + ); + sourceTree = ""; + }; + DAC2D66A1C9D743D009E9C19 /* Products */ = { + isa = PBXGroup; + children = ( + DAC2D6691C9D743D009E9C19 /* Tablet.framework */, + DAC2D6731C9D743D009E9C19 /* TabletTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + DAC2D6831C9D74EE009E9C19 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + DAC2D6841C9D7517009E9C19 /* Info.plist */, + DAC2D6851C9D7517009E9C19 /* Tablet.h */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + DAC2D68B1C9D7990009E9C19 /* Classes */ = { + isa = PBXGroup; + children = ( + DAC2D68F1C9D799E009E9C19 /* Tablet.swift */, + DAC2D68C1C9D799E009E9C19 /* TableDirector.swift */, + DAC2D68D1C9D799E009E9C19 /* TableRowBuilder.swift */, + DAC2D68E1C9D799E009E9C19 /* TableSectionBuilder.swift */, + ); + name = Classes; + sourceTree = ""; + }; + DAC2D6941C9D7A03009E9C19 /* Tests */ = { + isa = PBXGroup; + children = ( + DAC2D6951C9D7A3B009E9C19 /* Info.plist */, + DAC2D6961C9D7A3B009E9C19 /* TabletTests.swift */, + ); + name = Tests; + path = ../Tests; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + DAC2D6661C9D743D009E9C19 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + DAC2D6871C9D7517009E9C19 /* Tablet.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + DAC2D6681C9D743D009E9C19 /* Tablet */ = { + isa = PBXNativeTarget; + buildConfigurationList = DAC2D67D1C9D743D009E9C19 /* Build configuration list for PBXNativeTarget "Tablet" */; + buildPhases = ( + DAC2D6641C9D743D009E9C19 /* Sources */, + DAC2D6651C9D743D009E9C19 /* Frameworks */, + DAC2D6661C9D743D009E9C19 /* Headers */, + DAC2D6671C9D743D009E9C19 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Tablet; + productName = Tablet; + productReference = DAC2D6691C9D743D009E9C19 /* Tablet.framework */; + productType = "com.apple.product-type.framework"; + }; + DAC2D6721C9D743D009E9C19 /* TabletTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = DAC2D6801C9D743D009E9C19 /* Build configuration list for PBXNativeTarget "TabletTests" */; + buildPhases = ( + DAC2D66F1C9D743D009E9C19 /* Sources */, + DAC2D6701C9D743D009E9C19 /* Frameworks */, + DAC2D6711C9D743D009E9C19 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + DAC2D6761C9D743D009E9C19 /* PBXTargetDependency */, + ); + name = TabletTests; + productName = TabletTests; + productReference = DAC2D6731C9D743D009E9C19 /* TabletTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + DAC2D6601C9D743D009E9C19 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0720; + LastUpgradeCheck = 0720; + ORGANIZATIONNAME = Tablet; + TargetAttributes = { + DAC2D6681C9D743D009E9C19 = { + CreatedOnToolsVersion = 7.2; + }; + DAC2D6721C9D743D009E9C19 = { + CreatedOnToolsVersion = 7.2; + }; + }; + }; + buildConfigurationList = DAC2D6631C9D743D009E9C19 /* Build configuration list for PBXProject "Tablet" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = DAC2D65F1C9D743D009E9C19; + productRefGroup = DAC2D66A1C9D743D009E9C19 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + DAC2D6681C9D743D009E9C19 /* Tablet */, + DAC2D6721C9D743D009E9C19 /* TabletTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + DAC2D6671C9D743D009E9C19 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DAC2D6711C9D743D009E9C19 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + DAC2D6641C9D743D009E9C19 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + DAC2D6901C9D799E009E9C19 /* TableDirector.swift in Sources */, + DAC2D6921C9D799E009E9C19 /* TableSectionBuilder.swift in Sources */, + DAC2D6911C9D799E009E9C19 /* TableRowBuilder.swift in Sources */, + DAC2D6931C9D799E009E9C19 /* Tablet.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DAC2D66F1C9D743D009E9C19 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + DAC2D6991C9D7A3F009E9C19 /* TabletTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + DAC2D6761C9D743D009E9C19 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = DAC2D6681C9D743D009E9C19 /* Tablet */; + targetProxy = DAC2D6751C9D743D009E9C19 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + DAC2D67B1C9D743D009E9C19 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + DAC2D67C1C9D743D009E9C19 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + DAC2D67E1C9D743D009E9C19 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.tablet.tablet.Tablet; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + DAC2D67F1C9D743D009E9C19 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.tablet.tablet.Tablet; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Release; + }; + DAC2D6811C9D743D009E9C19 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = ../Tests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.tablet.tablet.TabletTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + DAC2D6821C9D743D009E9C19 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = ../Tests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.tablet.tablet.TabletTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + DAC2D6631C9D743D009E9C19 /* Build configuration list for PBXProject "Tablet" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + DAC2D67B1C9D743D009E9C19 /* Debug */, + DAC2D67C1C9D743D009E9C19 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + DAC2D67D1C9D743D009E9C19 /* Build configuration list for PBXNativeTarget "Tablet" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + DAC2D67E1C9D743D009E9C19 /* Debug */, + DAC2D67F1C9D743D009E9C19 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + DAC2D6801C9D743D009E9C19 /* Build configuration list for PBXNativeTarget "TabletTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + DAC2D6811C9D743D009E9C19 /* Debug */, + DAC2D6821C9D743D009E9C19 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = DAC2D6601C9D743D009E9C19 /* Project object */; +} diff --git a/Tablet/Tablet.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Tablet/Tablet.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..78fd6b2 --- /dev/null +++ b/Tablet/Tablet.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Tablet/Tablet.xcodeproj/project.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate b/Tablet/Tablet.xcodeproj/project.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..a996426bada54996a79ea5667b18677a8ff9deab GIT binary patch literal 40699 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 W+D7}q4Gs?kZZzSYn>>Cqw)ubSY7l(@ literal 0 HcmV?d00001 diff --git a/Tablet/Tablet.xcodeproj/xcuserdata/maxsokolov.xcuserdatad/xcschemes/Tablet.xcscheme b/Tablet/Tablet.xcodeproj/xcuserdata/maxsokolov.xcuserdatad/xcschemes/Tablet.xcscheme new file mode 100644 index 0000000..b6e3630 --- /dev/null +++ b/Tablet/Tablet.xcodeproj/xcuserdata/maxsokolov.xcuserdatad/xcschemes/Tablet.xcscheme @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tablet/Tablet.xcodeproj/xcuserdata/maxsokolov.xcuserdatad/xcschemes/xcschememanagement.plist b/Tablet/Tablet.xcodeproj/xcuserdata/maxsokolov.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..942caa5 --- /dev/null +++ b/Tablet/Tablet.xcodeproj/xcuserdata/maxsokolov.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,27 @@ + + + + + SchemeUserState + + Tablet.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + DAC2D6681C9D743D009E9C19 + + primary + + + DAC2D6721C9D743D009E9C19 + + primary + + + + + diff --git a/TabletDemo/TabletDemo/AppDelegate.swift b/TabletDemo/Classes/Application/AppDelegate.swift similarity index 100% rename from TabletDemo/TabletDemo/AppDelegate.swift rename to TabletDemo/Classes/Application/AppDelegate.swift diff --git a/TabletDemo/Classes/Presentation/Main/ViewControllers/MainViewController.swift b/TabletDemo/Classes/Presentation/Main/ViewControllers/MainViewController.swift new file mode 100644 index 0000000..6677dd7 --- /dev/null +++ b/TabletDemo/Classes/Presentation/Main/ViewControllers/MainViewController.swift @@ -0,0 +1,28 @@ +// +// MainViewController.swift +// TabletDemo +// +// Created by Max Sokolov on 19/03/16. +// Copyright © 2016 Tablet. All rights reserved. +// + +import Foundation +import UIKit + +class MainViewController : UITableViewController { + + var tableDirector: TableDirector! + + override func viewDidLoad() { + super.viewDidLoad() + + tableDirector = TableDirector(tableView: tableView) + + tableDirector += TableRowBuilder(items: [1, 2, 3, 4], id: "cell") + .action(.configure) { data -> Void in + + data.cell?.accessoryType = .DisclosureIndicator + data.cell?.textLabel?.text = "\(data.item)" + } + } +} \ No newline at end of file diff --git a/TabletDemo/TabletDemo/Base.lproj/LaunchScreen.storyboard b/TabletDemo/Resources/Storyboards/LaunchScreen.storyboard similarity index 100% rename from TabletDemo/TabletDemo/Base.lproj/LaunchScreen.storyboard rename to TabletDemo/Resources/Storyboards/LaunchScreen.storyboard diff --git a/TabletDemo/TabletDemo/Base.lproj/Main.storyboard b/TabletDemo/Resources/Storyboards/Main.storyboard similarity index 75% rename from TabletDemo/TabletDemo/Base.lproj/Main.storyboard rename to TabletDemo/Resources/Storyboards/Main.storyboard index 65ef436..d299801 100644 --- a/TabletDemo/TabletDemo/Base.lproj/Main.storyboard +++ b/TabletDemo/Resources/Storyboards/Main.storyboard @@ -1,8 +1,8 @@ - + - + @@ -19,7 +19,6 @@ - @@ -32,15 +31,12 @@ - - @@ -51,7 +47,6 @@ - @@ -80,7 +73,6 @@ - @@ -89,7 +81,6 @@ - @@ -107,6 +98,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -115,7 +135,6 @@ - @@ -126,5 +145,23 @@ + + + + + + + + + + + + + + + + + + diff --git a/TabletDemo/TabletDemo.xcodeproj/project.pbxproj b/TabletDemo/TabletDemo.xcodeproj/project.pbxproj index c043d8b..4d8e6af 100644 --- a/TabletDemo/TabletDemo.xcodeproj/project.pbxproj +++ b/TabletDemo/TabletDemo.xcodeproj/project.pbxproj @@ -11,32 +11,47 @@ 508B71861BF48E0D00272920 /* TableRowBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508B71851BF48E0D00272920 /* TableRowBuilder.swift */; }; DA1BCD0F1BF5472C00CC0479 /* TableDirector.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA1BCD0E1BF5472C00CC0479 /* TableDirector.swift */; }; DA1BCD111BF7388C00CC0479 /* CustomTableActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA1BCD101BF7388C00CC0479 /* CustomTableActions.swift */; }; - DAB7EB2B1BEF787300D2AD5E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAB7EB2A1BEF787300D2AD5E /* AppDelegate.swift */; }; DAB7EB2D1BEF787300D2AD5E /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAB7EB2C1BEF787300D2AD5E /* ViewController.swift */; }; - DAB7EB301BEF787300D2AD5E /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DAB7EB2E1BEF787300D2AD5E /* Main.storyboard */; }; DAB7EB321BEF787300D2AD5E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DAB7EB311BEF787300D2AD5E /* Assets.xcassets */; }; - DAB7EB351BEF787300D2AD5E /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DAB7EB331BEF787300D2AD5E /* LaunchScreen.storyboard */; }; DAB7EB3E1BEF78A400D2AD5E /* Tablet.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAB7EB3D1BEF78A400D2AD5E /* Tablet.swift */; }; DAB7EB401BEFD07E00D2AD5E /* ConfigurableTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAB7EB3F1BEFD07E00D2AD5E /* ConfigurableTableViewCell.swift */; }; + DAC2D5CA1C9D303E009E9C19 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC2D5C91C9D303E009E9C19 /* AppDelegate.swift */; }; + DAC2D5CF1C9D30A7009E9C19 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DAC2D5CD1C9D30A7009E9C19 /* Main.storyboard */; }; + DAC2D5D01C9D30A7009E9C19 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DAC2D5CE1C9D30A7009E9C19 /* LaunchScreen.storyboard */; }; + DAC2D5D41C9D3118009E9C19 /* MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC2D5D31C9D3118009E9C19 /* MainViewController.swift */; }; + DAC2D5E61C9D6493009E9C19 /* TabletTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC2D5D61C9D638F009E9C19 /* TabletTests.swift */; }; DAED08F11C14DE7E006C04D8 /* MyTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAED08F01C14DE7E006C04D8 /* MyTableViewCell.swift */; }; DAF003961C14DC0C0028C3D6 /* MyNibTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAF003951C14DC0C0028C3D6 /* MyNibTableViewCell.swift */; }; DAF003981C14DC250028C3D6 /* MyNibTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = DAF003971C14DC250028C3D6 /* MyNibTableViewCell.xib */; }; /* End PBXBuildFile section */ +/* Begin PBXContainerItemProxy section */ + DAC2D5E11C9D6433009E9C19 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DAB7EB1F1BEF787300D2AD5E /* Project object */; + proxyType = 1; + remoteGlobalIDString = DAB7EB261BEF787300D2AD5E; + remoteInfo = TabletDemo; + }; +/* End PBXContainerItemProxy section */ + /* Begin PBXFileReference section */ 508B71831BF48DD300272920 /* TableSectionBuilder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableSectionBuilder.swift; sourceTree = ""; }; 508B71851BF48E0D00272920 /* TableRowBuilder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableRowBuilder.swift; sourceTree = ""; }; DA1BCD0E1BF5472C00CC0479 /* TableDirector.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableDirector.swift; sourceTree = ""; }; DA1BCD101BF7388C00CC0479 /* CustomTableActions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomTableActions.swift; sourceTree = ""; }; DAB7EB271BEF787300D2AD5E /* TabletDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TabletDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; - DAB7EB2A1BEF787300D2AD5E /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; DAB7EB2C1BEF787300D2AD5E /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - DAB7EB2F1BEF787300D2AD5E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; DAB7EB311BEF787300D2AD5E /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - DAB7EB341BEF787300D2AD5E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; DAB7EB361BEF787300D2AD5E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; DAB7EB3D1BEF78A400D2AD5E /* Tablet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Tablet.swift; sourceTree = ""; }; DAB7EB3F1BEFD07E00D2AD5E /* ConfigurableTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConfigurableTableViewCell.swift; sourceTree = ""; }; + DAC2D5C91C9D303E009E9C19 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + DAC2D5CD1C9D30A7009E9C19 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = ""; }; + DAC2D5CE1C9D30A7009E9C19 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; }; + DAC2D5D31C9D3118009E9C19 /* MainViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainViewController.swift; sourceTree = ""; }; + DAC2D5D61C9D638F009E9C19 /* TabletTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TabletTests.swift; sourceTree = ""; }; + DAC2D5DC1C9D6433009E9C19 /* TabletTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TabletTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; DAED08F01C14DE7E006C04D8 /* MyTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MyTableViewCell.swift; sourceTree = ""; }; DAF003951C14DC0C0028C3D6 /* MyNibTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MyNibTableViewCell.swift; sourceTree = ""; }; DAF003971C14DC250028C3D6 /* MyNibTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MyNibTableViewCell.xib; sourceTree = ""; }; @@ -50,6 +65,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + DAC2D5D91C9D6433009E9C19 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -57,6 +79,9 @@ isa = PBXGroup; children = ( DAB7EB3C1BEF789500D2AD5E /* Tablet */, + DAC2D5C61C9D2FE5009E9C19 /* Classes */, + DAC2D5CB1C9D3058009E9C19 /* Resources */, + DAC2D5D51C9D635F009E9C19 /* Tests */, DAB7EB291BEF787300D2AD5E /* TabletDemo */, DAB7EB281BEF787300D2AD5E /* Products */, ); @@ -66,6 +91,7 @@ isa = PBXGroup; children = ( DAB7EB271BEF787300D2AD5E /* TabletDemo.app */, + DAC2D5DC1C9D6433009E9C19 /* TabletTests.xctest */, ); name = Products; sourceTree = ""; @@ -73,16 +99,14 @@ DAB7EB291BEF787300D2AD5E /* TabletDemo */ = { isa = PBXGroup; children = ( - DAB7EB2A1BEF787300D2AD5E /* AppDelegate.swift */, + DAC2D5C41C9D2F5C009E9C19 /* Presentation */, DAB7EB2C1BEF787300D2AD5E /* ViewController.swift */, DAB7EB3F1BEFD07E00D2AD5E /* ConfigurableTableViewCell.swift */, DA1BCD101BF7388C00CC0479 /* CustomTableActions.swift */, DAF003951C14DC0C0028C3D6 /* MyNibTableViewCell.swift */, DAF003971C14DC250028C3D6 /* MyNibTableViewCell.xib */, DAED08F01C14DE7E006C04D8 /* MyTableViewCell.swift */, - DAB7EB2E1BEF787300D2AD5E /* Main.storyboard */, DAB7EB311BEF787300D2AD5E /* Assets.xcassets */, - DAB7EB331BEF787300D2AD5E /* LaunchScreen.storyboard */, DAB7EB361BEF787300D2AD5E /* Info.plist */, ); path = TabletDemo; @@ -100,6 +124,80 @@ path = ../Tablet; sourceTree = ""; }; + DAC2D5C41C9D2F5C009E9C19 /* Presentation */ = { + isa = PBXGroup; + children = ( + ); + name = Presentation; + sourceTree = ""; + }; + DAC2D5C61C9D2FE5009E9C19 /* Classes */ = { + isa = PBXGroup; + children = ( + DAC2D5C81C9D3014009E9C19 /* Application */, + DAC2D5C71C9D3005009E9C19 /* Presentation */, + ); + path = Classes; + sourceTree = ""; + }; + DAC2D5C71C9D3005009E9C19 /* Presentation */ = { + isa = PBXGroup; + children = ( + DAC2D5D11C9D30D8009E9C19 /* Main */, + ); + path = Presentation; + sourceTree = ""; + }; + DAC2D5C81C9D3014009E9C19 /* Application */ = { + isa = PBXGroup; + children = ( + DAC2D5C91C9D303E009E9C19 /* AppDelegate.swift */, + ); + path = Application; + sourceTree = ""; + }; + DAC2D5CB1C9D3058009E9C19 /* Resources */ = { + isa = PBXGroup; + children = ( + DAC2D5CC1C9D306C009E9C19 /* Storyboards */, + ); + path = Resources; + sourceTree = ""; + }; + DAC2D5CC1C9D306C009E9C19 /* Storyboards */ = { + isa = PBXGroup; + children = ( + DAC2D5CD1C9D30A7009E9C19 /* Main.storyboard */, + DAC2D5CE1C9D30A7009E9C19 /* LaunchScreen.storyboard */, + ); + path = Storyboards; + sourceTree = ""; + }; + DAC2D5D11C9D30D8009E9C19 /* Main */ = { + isa = PBXGroup; + children = ( + DAC2D5D21C9D30E4009E9C19 /* ViewControllers */, + ); + path = Main; + sourceTree = ""; + }; + DAC2D5D21C9D30E4009E9C19 /* ViewControllers */ = { + isa = PBXGroup; + children = ( + DAC2D5D31C9D3118009E9C19 /* MainViewController.swift */, + ); + path = ViewControllers; + sourceTree = ""; + }; + DAC2D5D51C9D635F009E9C19 /* Tests */ = { + isa = PBXGroup; + children = ( + DAC2D5D61C9D638F009E9C19 /* TabletTests.swift */, + ); + name = Tests; + path = ../Tests; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -120,12 +218,31 @@ productReference = DAB7EB271BEF787300D2AD5E /* TabletDemo.app */; productType = "com.apple.product-type.application"; }; + DAC2D5DB1C9D6433009E9C19 /* TabletTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = DAC2D5E31C9D6433009E9C19 /* Build configuration list for PBXNativeTarget "TabletTests" */; + buildPhases = ( + DAC2D5D81C9D6433009E9C19 /* Sources */, + DAC2D5D91C9D6433009E9C19 /* Frameworks */, + DAC2D5DA1C9D6433009E9C19 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + DAC2D5E21C9D6433009E9C19 /* PBXTargetDependency */, + ); + name = TabletTests; + productName = TabletTests; + productReference = DAC2D5DC1C9D6433009E9C19 /* TabletTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ DAB7EB1F1BEF787300D2AD5E /* Project object */ = { isa = PBXProject; attributes = { + LastSwiftUpdateCheck = 0720; LastUpgradeCheck = 0700; ORGANIZATIONNAME = Tablet; TargetAttributes = { @@ -133,6 +250,10 @@ CreatedOnToolsVersion = 7.0.1; DevelopmentTeam = Z48R734SJX; }; + DAC2D5DB1C9D6433009E9C19 = { + CreatedOnToolsVersion = 7.2; + TestTargetID = DAB7EB261BEF787300D2AD5E; + }; }; }; buildConfigurationList = DAB7EB221BEF787300D2AD5E /* Build configuration list for PBXProject "TabletDemo" */; @@ -149,6 +270,7 @@ projectRoot = ""; targets = ( DAB7EB261BEF787300D2AD5E /* TabletDemo */, + DAC2D5DB1C9D6433009E9C19 /* TabletTests */, ); }; /* End PBXProject section */ @@ -158,10 +280,17 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - DAB7EB351BEF787300D2AD5E /* LaunchScreen.storyboard in Resources */, + DAC2D5CF1C9D30A7009E9C19 /* Main.storyboard in Resources */, + DAC2D5D01C9D30A7009E9C19 /* LaunchScreen.storyboard in Resources */, DAF003981C14DC250028C3D6 /* MyNibTableViewCell.xib in Resources */, DAB7EB321BEF787300D2AD5E /* Assets.xcassets in Resources */, - DAB7EB301BEF787300D2AD5E /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DAC2D5DA1C9D6433009E9C19 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( ); runOnlyForDeploymentPostprocessing = 0; }; @@ -173,6 +302,7 @@ buildActionMask = 2147483647; files = ( 508B71841BF48DD300272920 /* TableSectionBuilder.swift in Sources */, + DAC2D5D41C9D3118009E9C19 /* MainViewController.swift in Sources */, DAB7EB2D1BEF787300D2AD5E /* ViewController.swift in Sources */, DAB7EB3E1BEF78A400D2AD5E /* Tablet.swift in Sources */, DAED08F11C14DE7E006C04D8 /* MyTableViewCell.swift in Sources */, @@ -180,31 +310,28 @@ 508B71861BF48E0D00272920 /* TableRowBuilder.swift in Sources */, DA1BCD0F1BF5472C00CC0479 /* TableDirector.swift in Sources */, DAB7EB401BEFD07E00D2AD5E /* ConfigurableTableViewCell.swift in Sources */, - DAB7EB2B1BEF787300D2AD5E /* AppDelegate.swift in Sources */, + DAC2D5CA1C9D303E009E9C19 /* AppDelegate.swift in Sources */, DA1BCD111BF7388C00CC0479 /* CustomTableActions.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; + DAC2D5D81C9D6433009E9C19 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + DAC2D5E61C9D6493009E9C19 /* TabletTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ -/* Begin PBXVariantGroup section */ - DAB7EB2E1BEF787300D2AD5E /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - DAB7EB2F1BEF787300D2AD5E /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; +/* Begin PBXTargetDependency section */ + DAC2D5E21C9D6433009E9C19 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = DAB7EB261BEF787300D2AD5E /* TabletDemo */; + targetProxy = DAC2D5E11C9D6433009E9C19 /* PBXContainerItemProxy */; }; - DAB7EB331BEF787300D2AD5E /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - DAB7EB341BEF787300D2AD5E /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ +/* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ DAB7EB371BEF787300D2AD5E /* Debug */ = { @@ -297,7 +424,7 @@ INFOPLIST_FILE = TabletDemo/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.tablet.TabletDemo; + PRODUCT_BUNDLE_IDENTIFIER = com.tablet.tablet; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; }; @@ -312,12 +439,38 @@ INFOPLIST_FILE = TabletDemo/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.tablet.TabletDemo; + PRODUCT_BUNDLE_IDENTIFIER = com.tablet.tablet; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; }; name = Release; }; + DAC2D5E41C9D6433009E9C19 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + INFOPLIST_FILE = TabletTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.2; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.tablet.TabletTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TabletDemo.app/TabletDemo"; + }; + name = Debug; + }; + DAC2D5E51C9D6433009E9C19 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + INFOPLIST_FILE = TabletTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.2; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.tablet.TabletTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TabletDemo.app/TabletDemo"; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -339,6 +492,14 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + DAC2D5E31C9D6433009E9C19 /* Build configuration list for PBXNativeTarget "TabletTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + DAC2D5E41C9D6433009E9C19 /* Debug */, + DAC2D5E51C9D6433009E9C19 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; /* End XCConfigurationList section */ }; rootObject = DAB7EB1F1BEF787300D2AD5E /* Project object */; 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 9bdfddebe6679c2a4fd4715cb930f586e2c35a35..c254aa2559d971f9777b313fbd4578375be47943 100644 GIT binary patch literal 89586 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 L%>TbK<&yscppm=@ delta 14781 zcmaia2V7Iv7yrBWO*UbKJrW=gR)8cjL?z(HW zR&A}eTD8_)+uFMK-gQ*}H;G#O|N8&@#ZMsjymRik-*fIc=bm>Te?$Lt4a{<Fz$U@Q0v>;m6_AHYxG4{#pb26w<+a1Y!E z55N=f6g&g3!5i=ow1f800Xjk_=nMtW1-e2{=mou@KMaQ9FdE8W3{*fROoU0WJ?sQi zU@GhkGhjAU!(7-Ec7tWG99F=-(AW?5hXde1I0TM>4bTXAI01eJXTX`T3C@Sh;X1e( zeg${Iz3_XuA0C89;c<8xo`ZkEEAS4y3-7^a@Ht75G|7-G$&ogs7wJv1Z^?HQK>-R^8XQ0|luC8DI1F`SB^oYA5wIwTs$I9iV=oex#03zfi}i6VyrSSLzSy4t1BhN8P6$ zP!EmNBkD2rH}#TwOEWY}bF>X@OS{mnv>WY7`_dv>Ob5{sbR-=`N7He16(v#?E^mKX_J)8cVo<}dF7tzb;<#a2(l3q)%qc_r<=xy|u z^iKL~dJnyq{+`}XAEb?k=%e({^a=VT{TF?KzDQr9FVk1(tMoPc5&f8cLO*2)1~8Bz z8H%A9hG7|3#*J}jgp8O8VuG0vCYFg~9nBGhcQ_Ivd!R+r zU?bTmHjzzY+q21R2eu>IiA`a%SPiRX^VtHnJ6p;2V0*I0Dz=*K#r9+SvkmM>b`(3B zZDhx=W7%=+B=&Q59^1suXBV&w*`@3UCnN1zhZZ=JK3+VZaaih73+$3%? zH-$5CbGiB4V(trW1Gkae#BJuj0 zH*iSw(BZYc>P(G}dCq(e@57hkpI-d8{CE7BZC4!;r11ADQ(r-g>#xK);x|5n&*by? z?tBqn$@ehrso4-tTqSN1F0I5h;yQ7IxXEYnDn6T6w-UFBJA{_F$7^^zKcCCXOm82J zidhm_8TEZx>8O~LDLz#cdlR8`dj>S}w{Ru9ps z22@p#!0PIFeTDOXt=$=%Bou@a2!M;}>*@fq1-P1aREv7Omk8X6T;RZ$U>x*%3v_kP z#0Q#>h1S(fGgxV9)%^#a0)d1b5CJg=0>NFY2KKD)kJZr?XiDp9`&SRGtL#6BFXPL3 zqQY5aN}a51^05JKHdZY{L6|9TtdMR2QX&EW<;j|LivW?PgkF&ph{A&jy&@dTJ~5&R zO_CZI82VqQSV!!KI0J;-Xn?WT%n3sQGs{;K9$!bsydV$`c2GoK+ zpf5j!AIjJ9_53h?I6q=FHqihu5DWr?!4NPMyKMuH_-Xuf{xg0CcH3F8A7nLxvDkaT z7+?fEK>SF46hE48Yz5=MctQ&%@?&@-_FmrNy(3M+KHjQ-y%fv>vx&DLn8@X)@ME!q z5`3u@%Xvgx3uprK`EmS2?3~su3KoGSgrpfP=EpaKrThdF>XYIOR)Ce}!B&1!Gg!q> zHl6CDb+Y=;db9uVQ~7dJY~K@sZOpsgV#=x3sdkv**~!l`h4c$Fg5BV||3P#gMszoCUvvbKp0AF8?{dk>AB{;lJT`^NI@R z@SdjM`o+Y7Kfx8kWhM9vTmTorC2*Oa$2alw`33yKmEbD41}=je;3mI_U&1fsm-5XR z+6$BYo5CUJZ#v$ewgC^#%01#2n=bVCbq3GD-)4MX@XMOPOMbb@VL)^Ycnc{)vJ$+5 z1OyO5l5gQx@U8qxe$`4yLk6;tgEstXeht5tU&n7~3Lt@xY1V)-4$uu-2D(Ebzn=fX zRsSU8S9&Y$|Y#oY#hJ|kxE5qx9| zoC>G$C-{@RtVC1Yt4?2AJv=C7tS4dq_hDhPpy?BqxtQg&nWeO#ws(z%=QLaZ7s5q^ z9b628;ZnG)!XzH567hdw{Lb>1&cbHcf{80&D_n^mSPa(yC%6`PnPv{v8u3#X`Cr>Q z$$I#OHA(S*^5?Ai$!dZvW+&MSx4|#@-}vA8KR!B%H9uL?(T60`Cc%90k#8+daNg_$ zAM;AV|CLy*DdZEC;UTQ_8hpYD244IHyrzphVO8j7vrjC=Yjm{4e|Q3(tZ)uBZF2B3 zU95BDTHq-n;okvQ7M_7;E1ZMgKVVC?z+X*)^)e&;4gT@bgy;DyyuvE~g4u`{;U)em zf8$>xUWGS4vB*t$i@(NS=Vf_8DQNR2#=8$6{a=qh!H?eLWkD$emVbOQ9_K0e0{(;d zKKvWLgsv8Bi(lgQ+cN_61g^0E)&Qpi-3Z9}k; zOeZrxK9Pk0`1cVti6g;#t#CaEKZXP{pDe@_;LevclSK%S|5A#{QcNL!<%^mvntg~O zWEqJA!)mgetRTCSm1GaHCs~C6jlpIRU=iRDutC5U0lU>iFcD1RU_ti5Aw!F6Odka7 z%^wc@VLr#Sso{PeIgFUPoR{Z)Sj|WhnJqPn98EToV@M;(BjAL9GXeqxTo7PuI`Uhb`pNGQ2;t>z!V(B34-jw3AIXC} zfj}rlSn=Pg-^ z!p_p=eT<`giK#0nKgyp9Kp+i)Oa!t&hB``2g_z@)%ZG$TNvKc+(h z+xSMsPSzAp!*m;7`1}bqMGYC`OJ`GEiNqZsx6EKyVm>4G2y`a3+GA5!_;WG2v1i)tka~cPmvx)lz+^ zz6f+hpc?{Z2$Z){{iy-eKxz;I*xeQ*n1o;ruP`m`m4pu`5hgS!!Q?hcp8Nsh;nYa; zf<{mc2y{oFM+-HI8jS!BAx0d0{w;MWWUg!wsH|{K!AB*LDQa4vYa8-JE4insa$0E& zHHDgC)^92`jhaq>JS)Xx;^b17is~u2%DS2 zp`cGQwHSfE=CVXVEyo#+YNlEc=!d|+XAf#6wFX;?T1Bl!pg#fwTBx1aO&0eMjx1zNhw= z4z2Eo&*rrQ2Ouy4f#C=YL!hz3IrTjN0VdlS0$=JNb=VByA?hatFp48vs3X)-1V$k+ z+7v${#(JKlPEn^#U8@4=71SB(tf{oBQ!#ap`t6g7kUCFY!O@obllqIgKwYFRQI`?m z5kLrxMPM8P;}Mv!in>Z&qpnjosGHO+1STRd34z%NU_ea>EW)O?ah)C+QPOi@Rkb{C z$iO~$1?g3_xc;s9WK1=n*FfvIDPwwx>9MQGg?d6gGh5&(0+XAm=Lk%(THux00|uX_?fq9>2x-McBh3_Of2Dn_QK|&y%Ct(#yqqi?N0|#`w?hDU>*WEp)_K*D=-G7 ze)D|c{;Xc7-a9uPOow92&>_?z1mMB{vQ~9kSL>L zJ~0_Br`3dHld}h{pp8np9UV_6(1~;s-JbZ3?m%~>JJBh0D&3jxLZ{K`bOxPCXVEG; z8-XPVEJL6fffWd>L;ySSS_IbfJrLM{0M1rh5ZH#mb_8}H@HGP8Ag~94ZxPss0ABeI z2plxes-d-X4xLNq(fPEofG(tqXdSJmi|G=&ls3>^>27oxT~1ff-RVji%f>Ex0)aCK z{E5IN1g;@)4}oV0yhPw11Ob8^g7yeHA?S*r5J4{leGv>mFciTE1fvm*`y?#Ty{-Fx zX@&DzQ_O{RZ9)Rw&q`Wu65LKQgdnkRTlDJH`+#6dX1I56Hh$0twI~DjI3UThxJc6_&W{5#XC+kD&ceb({swH>04J0eW}d&_!(woHaQs92*|Gq+ zQrUI^U77CxDX^01fd%3Uv(GfkrdXl~GelKS+!*L-M|#{Q>7b%)tMYIEWdH zCE{WP8~h!X2nmadi_T0u@0?m<_8PguYPL@lY+%Niks8U2Vn&OZMg$>(B<|EBNVhUZ zhPU`2WDsP{TAsE*ocp(@k(tKK`cFM(Gjp&Wa}l&b(AKPn-Fv8Xd#4SsE-WrC&b+Yr zm``lIkXiPh0+%z*RwWz|bhId8g=+DP@~cg^Eh~#tDn9z*8fL?PirL6)!g_5%&>7*E z8CWkDi(ZSvREgQm7AXns;;>ue&$b5K!R-EsPaAlQ7JT+Fd#$RuA?W@=wbXB(#q@sR zINP#Td2GzTs{O#=BI`f4$PwnKRg4FMo*%{RUL2NGI1g)Nez_r!`?$bU3=T5V_az%q8afe=WnpbA!2Qf(uEAxzbj?w%Z!C(YKFb|YiHqpe_5*Z6w*39=`n~&vK8$!$4AsB|B z)XW!dI{!M-$O>3oGW{mPfcm(nP z1T%M{Whb=!6Bfs&vT3+NV>`255NwZNhZZ)S%|Ngdg884+8LZlpGhp)PgF)XmNrug{ zj(5b(*q$A&se~ah34-Ye z;yJTSe@+fGH@{~H*xqa{E`-?{1T#PMy8YX|k0R^G+M)MG%K){UB|9xzhE~Y zScYIZf)xmMN3aq%_u0+t7IrJU&Aiqg2=+v<3c=o%27gl?jqhx4f7MzEK;)t|^7V1M{@!G~D9znj^g5Ug!xk099hQ}bI(2H3~cadLGMdy2&eCo?){ zEcjT_>GuI3JvK1=2gc_!_AmZ0g8j|-=n))@&ql8&i<|aPfDL6Yvv^mpz!+XNBY@!> zfN@yC-e7OyVi*oYa1f7s^`=czJS+?Y*?a8$PgQ=zKK^vz8EY;mESR-H%nX;=G2XEM zuy4&^VV4<-U_GzsHcA;EAB|IrJTbP>a^B$}HW-IbtPBI8Mv-oHx7Ft&X0=_T!!EZ1Xq7N zjdI<&Dzn5&t_O#G@pA;{A=tEntLA!fy%C&`-~t2}HW_TeY9lv@tNX8K>$zdva0Ky& z!5*^|$G8+r!|>$$d`Par3w)^9$vw%DT#20jz8~ zVh8HE(!%>~~lC-B{ZOZXzeb>b!ffWhzLy@3e7#fZZ1vXk+B zEDe5%oQGc$mx1p1t?v+gBWonScQpsB24CYhp8J~Y96^9_KZ2_)eOhh-x3KJEpEeC^ zy#fy{A`d$7S>4$Zt!U z@u7BuRk`ilS5`f$Te$7!w=OQF_)b9ekgCdtz{$|U+%&UUc!NgyxjVI zFEMo;KH(?O?ePgeo=)L@;C|!|a)-?4_m%h@kD|;6czm?qhTv8NzeMmW1b1R*{r7ar z{cKHL+y48!$DOp2xBthvj{DV0+hIO(wK+m^=dI&k|9f_IZJOi^T#ejC?vk#s4!`l| z0l^VogqVmRltdEIiQa*4EgiWq*lWx&>=zI8j(o=jUddURhYe#8JA)~`rjY^rW zOc_(bR5F8@Axs^8^-;FjmZQj}1+KOz`Yz?;6wnJ>|ZHL>Av>k0b#&(YF zBHQJ*Ew-(;t8BN~?zG)yyW4i3?S9)IY!BL=vAt>g*!Hy@Whbx`+6CE#*@fFh+Qr(* z?UZ)$b}G99yRLS9>;~J7w3}tuWY=o9+HS4g7j_%%Hrt)EyJmOO?zY`My9aiU?2OOt zNqbv+dwWNFXL}EOFMA(*Kl=cCwS7^IqOvEOFD z-Tr|6kM@V`58EHLKW2a2{-phB`%Cus95@GGhXe<`Ll1`$4ig+^ILvaG<1p7@p2ISS zW``9HD;-ultaUixaL3`LqsTGbQQ@d`>|}H-a_sFm%yEk2O2^fXYaQ1+ZgAY>c**g$ z<0Ho>j?WxlIKFgZoCHoDPF_wvPJT{uC#6$Ir!uD=PRMD7(=4YsPIH|WIW2Ko=k$fs zMyJhA-#8s|I_>nA(?zGtPFI~{oD-dMor|3NI1hDR>b%1FnDco7EpQQd3nYRtLAW4N zU{ng)3sM9sfku!c$P?5E>IEYOqXlCG;{+1~lLS))O@eO)2LvYsX9ed3zY8u1E(xv( zt_dCp-nfu1vL|84X6AlxO5RMd%7LF0} z!m+~HLX+@wVUuuyaFK9{aG9`Kcue?*@VfA(@V4--@V@Y&@U`$C;X4oDL3+?0tVfVX zCyzpp29G%&i#(QkEca;f*x<3<=<&VB4;}|S4tpH+IOcKNEtQ!boF%i z4D=Lx275|8!#u-1BR%6iyLfi<9Ok*ibCu_I&%K@pJ&$@G^E~c(((_Nxo1V`+pL@RW zeCg%rn>y^7ImUg?WX0MS4Yh#dvk_>g1K`)x}HaRqR#e)yu2KtB;ql-fOJa zc&~|Glf6t{i@nx*t@qmCwaHuH9pGK+-OIbiyN`E2?|SbM-Xpz7dz-wMdpCQxc(;0Q z@!sXV+k3C~ci!K7AMyU#`xoyM-lx3Jc>m>n)BA~!osXxF$S24r#3$58>J#Uq@M-6h z;FIK&>|^j5?z7Nmo6l~aJwD(19QFCd=ySs7w9i?eb3S){Ui!T8dFu;&NnhI6%UA3h z>MQk)@Qw0K^6liC>f6OP%QxFs-xj}Ze%t+a_#N>3(eIGoVZSqem;J8#UH7}`5By1g+Mo5e@ptie z_xJGk@)!GS{PX=s`H%Ns=fBDSjQ?f-YyLOanX<^;?Q*b(q+!1F-c!0^EMz_h@Oz^uURKuusyU|wKZU`1eMV9&tnz}|s<0{aDy z3)~ubHt?B<5(z~?B8ezW6d{Td$waB598tcgP^1@?hzz1?(GXFCXq2c?WE2@EiYAMu zil&QZh-QiwidKu(iM|kR5^WJ}6MZMzC;DD=K=g;`rs$67p6H?IiRhUaifJ(`wiP>w zoy5N40I^6MEDjY*#qGq2;`ZW>;uLXbajv*rTq&*+_ZIgN_ZJTm4;7CUj~7oAPZ3WO z&k)ZN&k@fR?-HLEKL~O)2E_yw1&s4{q4A++Z!@RNlnsu()rT$(l4d^q(4dzNe@eZks41*&q#ljUX$LJz78kC zVK^0T6K)^w6fOu44vz{?3hxx&IXpc)J6sc<6P_17Bz#u*weZIgWCRmo6Ja0W6yXx# z9^o0`6A>8^9T6L$h=`9!is%rL6450hJ)&DgL&U_0B@uff9!A1QzsT@Nd1SlD#K`2x zPLWxW>d2hPd}Cx$q&{+1OSkM@riMF&TRMu$hsquWI%MkhyiicXF07riL@aP$)yfiH+KG8>t_%uyzm zMaW`ga#=fBf-GH@Ez`>KWI9=itgEa{)>k%0)*>^mm+h48k$orIFFPbVB0DBKF8fV( zU-m-wO7@TJU5s;#cZ^?5U`$YqB&JWy&=@{uLd@itX)&{6OfmCf=Ep3HSrzk5%#Sg@ z#5{<39xIHEj7^M9iftd;AvQa~6C&W&Uof^9< z_F9}6Cc zN$IoFO~&+j>GRVUr7uZemA)zctMvWpN7H{vKbd|e{apH`^sDJN(r=~TO~0RElM$2A zF{4+;z>Luu6EjR1i!+vHEYE1kXwBG=u{mQ~#`cVz8M`v}XZ(_JF5_Cp{fvhhk29WT zJkNNS2{Y+THq$oKKGQu@oEe#!nAtfqJu@p)otcwaoM|*rK`>6;Ro#+*JOm2$e$BPL-faQYEX>Raq*vN~_9K6{xzZs#OD3 zqg4}BlZ>hH)#KC?)l<}S)Ss*8s~4)5sF$hNsJE)WRUc9xRv%R#Qy*9VrarH}puVKOs=ls% zp#ED!YaBHKjhn_pd0{O`T?#ropHg zr5Uf8ty!vBty!nppxLb1rrE9eR`b2)faaj)C(Tu@oz_d6s?FAxXnSf0X&bbowMOk& z?F8)%?QHE_?L6%Q?ILZfcB^);_K5bh_N?}t_IK@h?KSO9?H%ns?L+Nj?du#WN08&4 z$kYD0AX-l5&!BjOjTAIbCyVat7zrQmIOsG(?dk+EoO(S)K&MRSYh70oYN zRP<8E=ma`9orlg_=cfzQMd+e*F}gUNQkS4h(sk3->IUhC>W1kWaCc;!ZlX~)SvOVJ ztlOyDq}#09s{2;=oo=6QzwWs1H{E&N1>I%cHQjyPL){bIbKOhbYdxnI=-u=ldM|yj zK2{&6m+O`K&iZtHmR_yT(dX&Q^|kt8`bqk!`p@*U^d|j0{Q~`B{WAS#{Wkq}{SN&u z{T}^y`u+MJ^au4P^yl@)XT|o#qT+VNImNw;M;GrYK2Ut5_)PKT;%mh>i|-WQFMe43 zPw~4FP(qdDm6VnAD5)-~Dd}G_sAOnKeaWbju_e<==9V;@<91*lYN~aL{nr@U!6;!&$=x!;LacS#DWLS+BDGWp!n!Y)0AavbkkV zWedxelr1mYP`0^jYngF-+0L?EWxLDvmR%|5%Hztrl~=)$$wVx6AL9KP-P-{;mR4kQGct|B8_nqbtT# zpo&Ws_bVP&Jg#`wUDv%w_p0u_y4QC9vHQ91e|EoO?L0zg{_RE(+-2*)htKZU{tps0 B?fU=# diff --git a/TabletDemo/TabletDemo.xcodeproj/xcuserdata/maxsokolov.xcuserdatad/xcschemes/TabletDemo.xcscheme b/TabletDemo/TabletDemo.xcodeproj/xcuserdata/maxsokolov.xcuserdatad/xcschemes/TabletDemo.xcscheme index 6db4123..5b59ce8 100644 --- a/TabletDemo/TabletDemo.xcodeproj/xcuserdata/maxsokolov.xcuserdatad/xcschemes/TabletDemo.xcscheme +++ b/TabletDemo/TabletDemo.xcodeproj/xcuserdata/maxsokolov.xcuserdatad/xcschemes/TabletDemo.xcscheme @@ -28,6 +28,16 @@ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" shouldUseLaunchSchemeArgsEnv = "YES"> + + + + primary + DAC2D5DB1C9D6433009E9C19 + + primary + + diff --git a/TabletDemo/TabletDemo/ConfigurableTableViewCell.swift b/TabletDemo/TabletDemo/ConfigurableTableViewCell.swift index 3160b73..4887c0e 100644 --- a/TabletDemo/TabletDemo/ConfigurableTableViewCell.swift +++ b/TabletDemo/TabletDemo/ConfigurableTableViewCell.swift @@ -28,6 +28,7 @@ class ConfigurableTableViewCell: UITableViewCell, ConfigurableCell { func configureWithItem(item: Item) { + accessoryType = .DisclosureIndicator button.setTitle("Button \(item)", forState: .Normal) } diff --git a/TabletDemo/TabletDemo/ViewController.swift b/TabletDemo/TabletDemo/ViewController.swift index 805aad2..388260c 100644 --- a/TabletDemo/TabletDemo/ViewController.swift +++ b/TabletDemo/TabletDemo/ViewController.swift @@ -35,7 +35,7 @@ class ViewController: UIViewController, UIScrollViewDelegate { print("end display: \(data.indexPath)") } - + let configurableRowBuilder = TableConfigurableRowBuilder(items: ["5", "6", "7", "8"]) .action(.click) { data -> Void in diff --git a/Tests/Info.plist b/Tests/Info.plist new file mode 100644 index 0000000..ba72822 --- /dev/null +++ b/Tests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/Tests/TabletTests.swift b/Tests/TabletTests.swift new file mode 100644 index 0000000..30c6f5c --- /dev/null +++ b/Tests/TabletTests.swift @@ -0,0 +1,47 @@ +// +// TableDirectorTests.swift +// TabletDemo +// +// Created by Max Sokolov on 19/03/16. +// Copyright © 2016 Tablet. All rights reserved. +// + +import XCTest +import Tablet + +class TestController : UITableViewController { + + var tableDirector: TableDirector! + + override func viewDidLoad() { + super.viewDidLoad() + + tableDirector = TableDirector(tableView: tableView) + } +} + +class TabletTests: XCTestCase { + + var testController: TestController! + + override func setUp() { + super.setUp() + + testController = TestController() + } + + override func tearDown() { + + testController = nil + super.tearDown() + } + + func testTableDirectorHasTableView() { + + testController.view.hidden = false + + XCTAssertNotNil(testController.tableView) + XCTAssertNotNil(testController.tableDirector) + XCTAssertNotNil(testController.tableDirector.tableView) + } +} \ No newline at end of file From e639f2b4b84128c074fb95635750b5d74a7b02ab Mon Sep 17 00:00:00 2001 From: Max Sokolov Date: Sat, 19 Mar 2016 15:45:59 +0300 Subject: [PATCH 04/18] add test --- .../UserInterfaceState.xcuserstate | Bin 40699 -> 40826 bytes .../UserInterfaceState.xcuserstate | Bin 89586 -> 57855 bytes Tests/TabletTests.swift | 32 +++++++++++++++--- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/Tablet/Tablet.xcodeproj/project.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate b/Tablet/Tablet.xcodeproj/project.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate index a996426bada54996a79ea5667b18677a8ff9deab..32c36f83459ff5c0aa09c5ddf376e9d7af8ddbed 100644 GIT binary patch delta 15876 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 delta 15709 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 Vm(-X)0O)=aGju 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 c254aa2559d971f9777b313fbd4578375be47943..947d532e03e60a6c6b74624242c2c4b67ac49ed1 100644 GIT binary patch delta 26773 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 F_h0?k2u1(^ literal 89586 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 L%>TbK<&yscppm=@ diff --git a/Tests/TabletTests.swift b/Tests/TabletTests.swift index 30c6f5c..984e507 100644 --- a/Tests/TabletTests.swift +++ b/Tests/TabletTests.swift @@ -15,7 +15,6 @@ class TestController : UITableViewController { override func viewDidLoad() { super.viewDidLoad() - tableDirector = TableDirector(tableView: tableView) } } @@ -37,11 +36,36 @@ class TabletTests: XCTestCase { } func testTableDirectorHasTableView() { + + XCTAssertNotNil(testController.tableView, "TestController should have table view") + XCTAssertNotNil(testController.tableDirector, "TestController should have table director") + XCTAssertNotNil(testController.tableDirector.tableView, "TableDirector should have table view") + } + + func testSimpleRowBuilder() { + + let source = ["1", "2", "3"] + + let row = TableRowBuilder(items: source) + .action(.configure) { data -> Void in + + XCTAssertNotNil(data.cell, "Action should have cell") + data.cell?.textLabel?.text = "\(data.item)" + } testController.view.hidden = false + testController.tableDirector += row + testController.tableView.reloadData() - XCTAssertNotNil(testController.tableView) - XCTAssertNotNil(testController.tableDirector) - XCTAssertNotNil(testController.tableDirector.tableView) + XCTAssertTrue(testController.tableView.dataSource?.numberOfSectionsInTableView?(testController.tableView) == 1, "Table view should have a section") + XCTAssertTrue(testController.tableView.dataSource?.tableView(testController.tableView, numberOfRowsInSection: 0) == source.count, "Table view should have certain number of rows in a section") + + for (index, element) in source.enumerate() { + + let cell = testController.tableView.cellForRowAtIndexPath(NSIndexPath(forRow: index, inSection: 0)) + + XCTAssertNotNil(cell) + XCTAssertTrue(cell?.textLabel?.text == element) + } } } \ No newline at end of file From 51cbfe71b23c3d3ed06e233947143cf0ca96e57b Mon Sep 17 00:00:00 2001 From: Max Sokolov Date: Sat, 19 Mar 2016 17:01:12 +0300 Subject: [PATCH 05/18] setup travis config --- .travis.yml | 7 ++++++ README.md | 1 + Tablet.xcworkspace/contents.xcworkspacedata | 3 +++ .../UserInterfaceState.xcuserstate | Bin 5070 -> 7864 bytes Tablet/Tablet.h | 20 ++++++++++++---- Tablet/Tablet.xcodeproj/project.pbxproj | 4 ++-- .../UserInterfaceState.xcuserstate | Bin 40826 -> 18451 bytes .../xcschemes/Tablet.xcscheme | 0 .../xcschemes/xcschememanagement.plist | 2 +- Tests/TabletTests.swift | 22 ++++++++++++++---- 10 files changed, 47 insertions(+), 12 deletions(-) create mode 100644 .travis.yml rename Tablet/Tablet.xcodeproj/{xcuserdata/maxsokolov.xcuserdatad => xcshareddata}/xcschemes/Tablet.xcscheme (100%) diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..0da8639 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,7 @@ +language: objective-c +before_install: + - cd Tablet +script: + - xctool test -project Tablet.xcodeproj -scheme Tablet -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 6' GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES +after_success: + - cd $TRAVIS_BUILD_DIR \ No newline at end of file diff --git a/README.md b/README.md index d6086ef..4dc8199 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ ![Tablet](https://raw.githubusercontent.com/maxsokolov/tablet/assets/tablet.png)

+Build Status Swift 2 compatible Platform iOS CocoaPods compatible diff --git a/Tablet.xcworkspace/contents.xcworkspacedata b/Tablet.xcworkspace/contents.xcworkspacedata index 94b2795..64eb7dc 100644 --- a/Tablet.xcworkspace/contents.xcworkspacedata +++ b/Tablet.xcworkspace/contents.xcworkspacedata @@ -1,4 +1,7 @@ + + diff --git a/Tablet.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate b/Tablet.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate index 145551c86c5bbea553b0d8bf8f1903b94b2bfc76..de3e9e8270699bd5166af17d9585094c404dc20e 100644 GIT binary patch literal 7864 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 delta 3198 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 Ezv*Y1Z2$lO diff --git a/Tablet/Tablet.h b/Tablet/Tablet.h index a1d2602..c09efa2 100644 --- a/Tablet/Tablet.h +++ b/Tablet/Tablet.h @@ -1,10 +1,22 @@ // -// Tablet.h -// Tablet +// Copyright (c) 2015 Max Sokolov https://twitter.com/max_sokolov // -// Created by Max Sokolov on 19/03/16. -// Copyright © 2016 Tablet. All rights reserved. +// 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 Foundation; diff --git a/Tablet/Tablet.xcodeproj/project.pbxproj b/Tablet/Tablet.xcodeproj/project.pbxproj index f178aa9..49ea0b1 100644 --- a/Tablet/Tablet.xcodeproj/project.pbxproj +++ b/Tablet/Tablet.xcodeproj/project.pbxproj @@ -342,7 +342,7 @@ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.tablet.tablet.Tablet; + PRODUCT_BUNDLE_IDENTIFIER = com.tablet.tablet; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -361,7 +361,7 @@ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.tablet.tablet.Tablet; + PRODUCT_BUNDLE_IDENTIFIER = com.tablet.tablet; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; }; diff --git a/Tablet/Tablet.xcodeproj/project.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate b/Tablet/Tablet.xcodeproj/project.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate index 32c36f83459ff5c0aa09c5ddf376e9d7af8ddbed..71cef90839ad0ed8ecaf83abb09d3063d2252560 100644 GIT binary patch delta 10714 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 N^tI0?-xy@?`afo^qN4x+ literal 40826 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≉< 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

Y z-TX@PYc1I=1uaD_LoK(q+|lxPtGZRwYHMB4x~O$$>z%E8TK{yg4z;7oQRirMY;x>y z-0b+?@w?;C#rccN7SCRM+2ZRLZ(97x;;$DUZPT{pwask9Z5!GyZhN!sqqa|%OkOf| zN!pTCOU_(!&XPk*-e2-jdscgXyP^Hs_ATw(+J9(2-u~B8>(cp4?Mrtr-Lv%GrGG6` zEfbcRmo+S#w`||C{mY){2=9pPNa$GKabCxUj*mOO>iD)ZrZc%SwX?Z%S!Y-0?VbBN zAL#Px3hWB$s_$CV)zWoK*F9bPy8i5DyVc$K-DTagyD#m&u6twmXWid+f8S&1ncY*> zb8XL-o^3tf_59Xze0kCGisjYIuU|g2e8=)%mjB(0daHWtdK-K9_CC`4SYL2obl;S| zfxh*9xbI-!yL}(@PwUU^pV5C&|JD81^}pT!N&n{qQwCB7(g!*R1_xFRJUZ~q!1Dut z4XOr(!TiCp!P$dVgXY18!Fhu#2hSNicksNy3kI(lynXPl!FvYx4L&gV@ZkQzCk77; zK0Elr;LC$w4E{ego&8UiRUC&2ij+xWk3K;W;Id3f90g;M&cLxT2=HZ09GGvbY3j@+ z&;8u@Ip6O&=RW7iIZrbvtF1XC5;DhX$(XLOjGwfLFx^30Xt$(c9#0 z@!s}2y>73^JMHz66p~Knk@@6B;t)l4l3MaU*+o7gdq^W`BA=7}q=mGR!=#IxBIn3? z(oZgtE955mi`*q6-JIi)Zj>{1q?Y z0N%n;_9#nWkF)74$P(F1HjB+>bJzl}kqCgaiVo@rVh?SyBtQKoUNVtLsDwyy^t@uDRh|ff`_(HUZFGaiP6y4%C zaZy|rgJMYB5X0h*81X0jQ~byL1V7*h{UkrxPw~_Ixqh}^>c8Q8eyzXH@9=wNP(CeZ z$qf05%$EhSP!`K&vRqckO1Vnb$rgE3o|I?gIeA|8%S-Z#9F%wEn2J&{Dptj-1Qk$0 zm8kO6R<&C-sTS3$zEj84adkp SchemeUserState - Tablet.xcscheme + Tablet.xcscheme_^#shared#^_ orderHint 0 diff --git a/Tests/TabletTests.swift b/Tests/TabletTests.swift index 984e507..e62c2b1 100644 --- a/Tests/TabletTests.swift +++ b/Tests/TabletTests.swift @@ -1,10 +1,22 @@ // -// TableDirectorTests.swift -// TabletDemo +// Copyright (c) 2015 Max Sokolov https://twitter.com/max_sokolov // -// Created by Max Sokolov on 19/03/16. -// Copyright © 2016 Tablet. All rights reserved. +// 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 XCTest import Tablet @@ -49,7 +61,7 @@ class TabletTests: XCTestCase { let row = TableRowBuilder(items: source) .action(.configure) { data -> Void in - XCTAssertNotNil(data.cell, "Action should have cell") + XCTAssertNotNil(data.cell, "Action should have a cell") data.cell?.textLabel?.text = "\(data.item)" } From ffefdaba820724dfad9205698ea0296908d79000 Mon Sep 17 00:00:00 2001 From: Max Sokolov Date: Sat, 19 Mar 2016 17:12:49 +0300 Subject: [PATCH 06/18] update travis config --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 0da8639..d65a575 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,5 @@ language: objective-c +osx_image: xcode7.2 before_install: - cd Tablet script: From 28b6b3796b46d768ad777480723ff6d1dded3b65 Mon Sep 17 00:00:00 2001 From: Max Sokolov Date: Sat, 19 Mar 2016 17:16:56 +0300 Subject: [PATCH 07/18] update travis config --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index d65a575..a8a2efc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,6 @@ osx_image: xcode7.2 before_install: - cd Tablet script: - - xctool test -project Tablet.xcodeproj -scheme Tablet -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 6' GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES + - xctool clean build test -project Tablet.xcodeproj -scheme Tablet -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 6' GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES after_success: - cd $TRAVIS_BUILD_DIR \ No newline at end of file From eefb885c44c525bffb707d6cdcc131ed52f69264 Mon Sep 17 00:00:00 2001 From: Max Sokolov Date: Sat, 19 Mar 2016 17:44:49 +0300 Subject: [PATCH 08/18] docs updated --- .travis.yml | 7 +++-- README.md | 26 ++++++++++++++---- .../UserInterfaceState.xcuserstate | Bin 18451 -> 19011 bytes .../UserInterfaceState.xcuserstate | Bin 57855 -> 57640 bytes 4 files changed, 25 insertions(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index a8a2efc..b570850 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,11 @@ language: objective-c osx_image: xcode7.2 +branches: + only: + - master before_install: - cd Tablet script: - - xctool clean build test -project Tablet.xcodeproj -scheme Tablet -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 6' GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES + - xctool clean build test -project Tablet.xcodeproj -scheme Tablet -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 6' GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES after_success: - - cd $TRAVIS_BUILD_DIR \ No newline at end of file + - cd $TRAVIS_BUILD_DIR \ No newline at end of file diff --git a/README.md b/README.md index 4dc8199..5ab6266 100644 --- a/README.md +++ b/README.md @@ -10,11 +10,21 @@ Tablet is a super lightweight yet powerful generic library that handles a complexity of UITableView's datasource and delegate methods in a Swift environment. Tablet's goal is to provide an easiest way to create complex table views. With Tablet you don't have to write a messy code of `switch` or `if` statements when you deal with bunch of different cells in different sections. -That's almost all you need in your controller to build a bunch of cells in a section: +## Features + +- [x] Powerfull type-safe system based on generics +- [x] Chainable cell actions +- [x] Support cells created from code, xib, or storyboard +- [x] Automatic xib/classes registration +- [x] No need to subclass +- [x] Extensibility +- [x] Tests + +That's almost all you need in your controller to build a bunch of cells in a section 😘: ```swift -TableConfigurableRowBuilder(items: ["1", "2", "3", "4", "5"], estimatedRowHeight: 42) +TableConfigurableRowBuilder(items: ["1", "2", "3", "4", "5"]) ``` -Tablet respects cells reusability feature and it's type-safe. See the Usage section to learn more. +Tablet respects cells reusability feature and built with performace in mind. See the Usage section to learn more. ## Requirements @@ -78,6 +88,10 @@ class MyTableViewCell : UITableViewCell, ConfigurableCell { return "reusable_id" } + static func estimatedHeight() -> Float { + return 255 + } + func configureWithItem(item: Item) { // item is user here textLabel?.text = item.username @@ -90,7 +104,7 @@ Once you've implemented the protocol, simply use the `TableConfigurableRowBuilde ```swift import Tablet -let rowBuilder = TableConfigurableRowBuilder(estimatedRowHeight: 42) +let rowBuilder = TableConfigurableRowBuilder() rowBuilder.appendItems(users) director = TableDirector(tableView: tableView) @@ -135,7 +149,7 @@ And receive this actions with your row builder: ```swift import Tablet -let rowBuilder = TableConfigurableRowBuilder(items: users, id: "reusable_id", estimatedRowHeight: 42) +let rowBuilder = TableConfigurableRowBuilder(items: users, id: "reusable_id") .action(.click) { data -> Void in } @@ -166,7 +180,7 @@ extension TableDirector { ``` Catch your action with row builder: ```swift -let rowBuilder = TableConfigurableRowBuilder(items: users, estimatedRowHeight: 42) +let rowBuilder = TableConfigurableRowBuilder(items: users) .action(kTableDirectorDidEndDisplayingCell) { data -> Void in } diff --git a/Tablet/Tablet.xcodeproj/project.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate b/Tablet/Tablet.xcodeproj/project.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate index 71cef90839ad0ed8ecaf83abb09d3063d2252560..b0f72cb51d0a8075441a3c265fac097adb784daf 100644 GIT binary patch delta 9567 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 MlY%b|&-6Y22XvWG^8f$< delta 9349 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 EACCHpJOBUy delta 27743 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 From 9309ac77660e402cb9e7d0066d58f5a8cdeef658 Mon Sep 17 00:00:00 2001 From: Max Sokolov Date: Sat, 19 Mar 2016 19:58:39 +0300 Subject: [PATCH 09/18] add test, bump readme --- README.md | 8 ++-- .../UserInterfaceState.xcuserstate | Bin 19011 -> 18529 bytes Tests/TabletTests.swift | 44 +++++++++++++++++- 3 files changed, 48 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 5ab6266..5851397 100644 --- a/README.md +++ b/README.md @@ -12,11 +12,13 @@ Tablet is a super lightweight yet powerful generic library that handles a comple ## Features -- [x] Powerfull type-safe system based on generics +- [x] Type-safe cells based on generics +- [x] The easiest way to map your models or view models to cells - [x] Chainable cell actions - [x] Support cells created from code, xib, or storyboard - [x] Automatic xib/classes registration - [x] No need to subclass +- [x] Correctly handles autolayout cells with multiline labels - [x] Extensibility - [x] Tests @@ -66,7 +68,7 @@ let rowBuilder = TableRowBuilder(items: [user1, user2, us data.cell?.detailTextLabel?.text = data.item.isActive ? "Active" : "Inactive" } -let sectionBuilder = TableSectionBuilder(headerTitle: "Users", rowBuilders: [rowBuilder]) +let sectionBuilder = TableSectionBuilder(headerTitle: "Users", rows: [rowBuilder]) director = TableDirector(tableView: tableView) director.appendSections(sectionBuilder) @@ -108,7 +110,7 @@ let rowBuilder = TableConfigurableRowBuilder() rowBuilder.appendItems(users) director = TableDirector(tableView: tableView) -tableDirector.appendSection(TableSectionBuilder(rowBuilders: [rowBuilder])) +tableDirector.appendSection(TableSectionBuilder(rows: [rowBuilder])) ``` ### Cell actions diff --git a/Tablet/Tablet.xcodeproj/project.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate b/Tablet/Tablet.xcodeproj/project.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate index b0f72cb51d0a8075441a3c265fac097adb784daf..1d9a3e24c33e7440457d607808e545d54d4c0346 100644 GIT binary patch delta 10414 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 dxSsJK<7vjj_#GPj0wCkn{{u0uc!K}{ delta 10715 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 String { + return TestTableViewCellOptions.ReusableIdentifier + } + + static func estimatedHeight() -> Float { + return TestTableViewCellOptions.EstimatedHeight + } + + func configureWithItem(item: Item) { + textLabel?.text = item.title + } +} + class TabletTests: XCTestCase { var testController: TestController! @@ -80,4 +108,18 @@ class TabletTests: XCTestCase { XCTAssertTrue(cell?.textLabel?.text == element) } } + + func testConfigurableRowBuilder() { + + let testData = TestData(title: "title") + + testController.view.hidden = false + testController.tableDirector += TableConfigurableRowBuilder(item: testData) + testController.tableView.reloadData() + + let cell = testController.tableView.cellForRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0)) as? TestTableViewCell + + XCTAssertNotNil(cell, "Cell should exists and should be TestTableViewCell") + XCTAssertTrue(cell?.textLabel?.text == testData.title, "Cell's textLabel.text should equal to testData's title") + } } \ No newline at end of file From 3e71cca18d700ee9f6fd05d454ff6aac39ebf7d7 Mon Sep 17 00:00:00 2001 From: Max Sokolov Date: Sat, 19 Mar 2016 19:59:29 +0300 Subject: [PATCH 10/18] bump readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5851397..a249334 100644 --- a/README.md +++ b/README.md @@ -14,11 +14,11 @@ Tablet is a super lightweight yet powerful generic library that handles a comple - [x] Type-safe cells based on generics - [x] The easiest way to map your models or view models to cells +- [x] Correctly handles autolayout cells with multiline labels - [x] Chainable cell actions - [x] Support cells created from code, xib, or storyboard - [x] Automatic xib/classes registration - [x] No need to subclass -- [x] Correctly handles autolayout cells with multiline labels - [x] Extensibility - [x] Tests From d59f2d10749dbc7ab520ffabc46e683d07b7e7fd Mon Sep 17 00:00:00 2001 From: Max Sokolov Date: Sat, 19 Mar 2016 20:06:37 +0300 Subject: [PATCH 11/18] bump readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a249334..91efbbe 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![Tablet](https://raw.githubusercontent.com/maxsokolov/tablet/assets/tablet.png) +![Tablet](https://raw.githubusercontent.com/maxsokolov/tablet/assets/tablet.jpg)

Build Status From 14de20d15443ff844ecd97ef831344987db65271 Mon Sep 17 00:00:00 2001 From: Max Sokolov Date: Sat, 19 Mar 2016 20:55:45 +0300 Subject: [PATCH 12/18] bump readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 91efbbe..565e953 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![Tablet](https://raw.githubusercontent.com/maxsokolov/tablet/assets/tablet.jpg) +#Tablet

Build Status From c9a3255e981b37d77631735b62954db0d5766c26 Mon Sep 17 00:00:00 2001 From: Max Sokolov Date: Sat, 19 Mar 2016 21:09:00 +0300 Subject: [PATCH 13/18] add test --- .../UserInterfaceState.xcuserstate | Bin 7864 -> 11619 bytes Tests/TabletTests.swift | 27 +++++++++++++++--- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/Tablet.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate b/Tablet.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate index de3e9e8270699bd5166af17d9585094c404dc20e..c6ec813bf47a3e3a59a71b40063da10462982fbd 100644 GIT binary patch literal 11619 zcmb_?2Y8cJ+y5D9nl@?jWT#EiBs8s{bWmE_GP@|07O12xo0zr_C6YEZNr8%m6U4y~ z7b-ZAwjhEFMMQbQ^*T{ehN!5o`^CLLQPh|J{p4v{f_?q`U*AWsizH{>=N`X%oYTkRqZGzee4 z`5`rSqIe`jTBJjIbO9QShM)`4MQA9>L|G^s4M#<2Dyl&jqiM*6YEd1kN7K;^G!xB2 zZRj!-KtU8j?Pw8NjFzAd6h_yf+t3EI32i~E(N?q_J%AoWkD#?^7kUEiMNgt<(TnI6 z^g23%-a*IFhv*~p75W-|gT6&SVhN7JQXG$EH~}YOIaXj3PR1$Nj4jxTQ?U)(aT*?i zv+;0TfJfocxEPnd+|T;KKvYh9>0KJ#fR`a_&9zSe}X^7-{SA^_xJ~V zmLP%&A(Ti+B9Rj{(U25kCKfV?WRMHUU{Xkm$Vf7Zj3#5qSW-?Vkt$M0>dAC6moySD z@soDaL6(!N$aQ2Lxt`ocHjs^^i*%D7vYR|c_K?TP6J#&>2iZrSBhQmp$m`?{@-OlM z`H*}>J|>@#Psx|$J93)*LVl%~5=v=2O`=L_phjw<$ux!9Xc`?tGieqbNk`GqbPO${ z<#arqNoUd7bPkF-oAekxUgvCW_xX;X1eA#6NP$#H zGkuCHYa!neoCTk~T3GLF^m&58Zj^+Sj4;}bIHYD0_AIM+bIyX?{F3pddBZaE3Uh~N z<_#NGmRU5uFh8?!Sn05`()^t9c_oEzPFGnze!4%fFxcj4RIHq^Lmk+o(8w@XL z41qNdOp=>R78Z;gqt@^DHFyG*!Fq4d+u(x}nfm)Y4W%(%`lU;AhT8KwhuW78%gckW zg$2VqI}b->nuBt?P%`jIc^KuPd^7?T%o4@f3XGZ|e&vH8^^!oq)6oqB3TI4lO^x7B zR6Zk7Im+0MMxoJY3>u5Zp<+~mN>Lf(n3`#rmg$(D8JLlowxjVNp9yFpszj4e6{<#) zSu#k-%&ukEvpuYqJ;QQY!)!PVaJ<^n!28@B2fthk{EMe}7I~XJA%9>lG>mWZ!ncwD z?{RaP!r7zB6C;0IQ*TFTYq^ux~MOi5OYMEK$w}z0IuytRRpiuJ7f8 zf`-Ag3a^i^@q`w*IYUV>2r%wx4T+Qnt34h5_K=%X!!REos^x>BU{-LkcYY`#%E#G= z7x*{_%|-K&8(o4tr~x&iCT3w)mdb3*&KztIOJmOMXg+ENPELlug~*3mP!&sOqkxmS z@W-=dY&r0EW94Keg_ZL+_Kce{YLCQqPAV5V>skxa0}deO;Lcza%8~nA!r~ z7Ehq#PhG5lA(p{L9z!e8m9W7|bQQW9Ht9sGz_YDEYiEEn^)&_f*7`ON{2!X#D6HEW zs_kfl9qmoMxKt8xx`G&Ek2u>O@J5ddI~A}Z4zmk5^d?$|u7~|@KsTbB(9LK)x&=)J zHH_k1wZAdKqIvyrASw}zXz_Sk`$`Or0N{+uz5AvmtB*8_aUuT=tAcU{V$c zO4M^8wKBxFh|6X5*@`O^Xm1R)2Y3+-Hlo}fbUV5O-N`OwSuBSskD$BJW}v(ab)%kH z{d?6#s9+bdp)7MCl@`I|9<|2spYXnGVKLm6G@O*Xm3LP9ST|2L$HF7PgTUs&KhHnt1>i;ZIq zwUfaZqrD%ae>x@s%_|Z^auJ6I*Yn6#)MU~$!t2C2d3<1m#~I8f(I-2gggS| z%@%2jPzw>pf73<)fEbjS5(%-Aqc$)=pE=q$ehI*til{tvngyUt6>*!!CI_CRoK9$F&8+&IzbYq8qp<0*RGAi z00gM#b@fJ6WeYq34~QTz&C}Y<&zik+2KvhS|fGEW}5 zZ_d)(f}EnE_S~YpoKD%yrTHU-Ff0dRFo?OZ0}q-r#nq<{9o^W03eWKw*oo6cpTXv` z86w0-6aZfcfQ>K0LvbdX$!4+H=K;2e&rz5>2S0n8aA5>F=lnP1jAG=d5MZVY6cPkg z+72F)50rtYhSuK3>E6(SiM$8eOIn*Mz*$2=>J9n$;NT%{E~C#ERe3{MqDn>OkmZU< zv<#fp5nP7kxEw9R73eV`%V_Wf`PuLp;CBg0)P;9Hl z;8V3zT$9@)P~FeZ9$YPORAkvyuo+y#nwS!7D-syzL;~Ysg+gFFY*=S!RK05POq8(& z*Wr3R9nWC%SuH*67f}6hJXqE^#Li99q znzwmDWN>twChQfq;qiRjj2Ezl%*R?->lO%(Cu1L^GPNKbzmUYZIdeULh2VxD?B^E? zfm3jrXK}s97tzU-*xp`^bT#@Tu}e&6WV$~9;ajjV;BA9I8g$waGbFOQ00JW0LMV50 zAI#vzxC4+8FJYH;;mcV-piK>4ukYkStPvC^F2mt&yc{zYWJ}o6=%KH~S0ha~UWu<_ zA=ciFuff-{MQkyvp9{^yZidQfs{EM!6J-#Vs&71Lh z*1;}k_5D1DIWr=2M2*>qZ=ctvFOmGF2X91>;Y63b6K@jEc^B*KfFxu%|t^=EB0OzIZ<@e{rKsaInUr{+12bC0R&Yr>)c2?t$5DUF>_zUFZYS{ z09(ZxL=nCw5O)y2&Q`PQ`iVP?-;CMl7=DYbVQX1^O}J-(wnU5|22T3YxGW(s1Mx(WxUU1^ z_Wv@YFZzx0?nnF!%Gioe;#2r1{4+ky*0WpKt?V|oVJrR>p8==xJLFj#*=8`xZXv%C z>lWjev_UGxH$}8w%(VnoM=23oQlX{71J1Q657c~g#5AB^GpMv6?1)8 z;{v{=SJV23_EJmYNIcSX5h=U9i^$j=Q3;E1P!bfjjSf{1B?y)zu{*nnirobX_BjD; zbdZ)9P)0Y=5k1?)?iRl2;L9e~P&3eIE3x(MZf9MrKDtaAaf)UD%<0G1+*`hYTaRWH_oK`5=}1*iQB^$Yl3l z$mLH={csWwVFiN1yCKdeh5< z;+zn)3@DB$0W-*~J_2U5NBRkvM=t3jz{7U+!5e8J^PvOnVA)-ynLXOyaVhZ$9bN3A zu80an0g<$kK;Irg_E`TOi^$>_=p>huD`1I;gCU*l@m?e%42OG2n5-aIvM1O+_EaAl zk*mq7b0LPTCTrMU_7A}*gz{0J%!CRKAUDTMUQcde``MG=jbN&Xv*Ns) z+G6J2PVS1Cw+S|Vx_{HY;*c=e&5iqCrkGJlZ6WtVj8C?bd&o9&FWF9Zko(v_*>mi9 z_5yp6y~JMLhMeR<@(|fc9wv{FT@XARVBfJH!x)9}pfFC009PpxwXn_aZ4Ct@RYwTt zAl*pmt>T;$`3Ecf0f@AMbHw7L2uh$$;?HUAtq?_oyseQ6hMUW&_5?#^{+2eVaq&(4 zDV8{`6k@uj$V8~hK~4)X2>7L_afr1|&{UIXG_kRwKtq%V`^nP+Ry~O^dxg2X$us0x z_A2{aI9P#*_L2XG*982+MTx7uP1x%E;4@}Sbmc7dWgIQu7?~ZN61m~COO95V29XYc7z?>O5P^# zkmKZC@*aDW9b@maf3Xw7K{I2>7kO0^;1_xQ?ZMu2i;WQgfNH@2GKr`Q4)a+e(py5&P7nNk@Vj^{28CB7IkDqH9K z#lcageMU|QC?Nz` zO`wV7AXUr^M&fozwAe@NLw1n;TSy`g91GN5)_ZEIq8iYB%274@n0?YswN%GGWuJj( z5V->mLXgma`}aDJNcc<5)Z*r>F+4tBT0PWCQ-#9IUk@9&vK1xRP8~7mPMtIZQ@GWcT&D!rKFtSdNGs_iT1BhrWIBbNWT)6q z>}PhG{lb1_XYQpnP}Q%ZE?P_LXg#EVzX5vJvftSs>_6-*e6ODwiip=$UNy@b9Pjfs zi}ybUvAG=VzmcyDPWM9E%m)Rpe{M(A3PCx<=15H^1P}>D;J!w2kqS?X*Vh4A^0^BL z36D=m*CAg#x4kk5c~N5kFdtU&wk`0t!nH|DJ7n(uKv5P{q{lWb3N=ND%RH}pWPaZ8 z!qVZnaD6s>#CW((%Nd?oIKCh+GiO9WK~7m|#juK^iuxsmBitkM>b*6>(lf=65krSX zh0#nGLKs9BP%phSjByx~FoqjWA8nz!FqVX|L$DBVPvFsG{ZFs20*iCCw+Pn;qWD~V zvv36|IHNyJncCKSp&?wU#I6=8dx%yZ!r`s7oi3t_=@Qxz#&Kb+2xBgcfuQ6*T%uP{ zCQ#lK=f-7zQ)+FjnudDwM+h0oI*gx>-< zr4?t0hgTheaaKtiL~E`NxU_4js}vS1_4}F*XIwCN$Ut|&y&HB9zOerycxYx~ zR(1~1FnxhH#KXxVw77)J{L&o6QI-hHR88Wi4!pMX~<&xl+mSp0-b@tA-3pJ8kg-SA^{ z&)mK$lu&x_p^wqWQ6cbI_!Tvez4RGKh5;w`(fxEeeTqIEL5q|yHUnUUu_cVH_s}rv zrq9vm;i{|~z=I79tUkn%tgIu8w;bFr6 zFjA<*M@Al|2f+$or*8;4FI>|_{P5tDIlqRnP2|*JdPHOj-%a5RV@n5682S?cn_o&o6rIY3?|Cut(Q&&i;J>4kJCyv)g=xipWK!K<7J;NYvk zxlg4RgCB2z*EcWHpCu+qo@A<|S<)s6O4=ohB}}qLvR-nhq)W0xvPW`2@~Y&Z8()E%{aQo8%A4**F|W<5Y2j;&S3Hi3`Sc$L)@LF7Exf zAL4$DJ1f;lby9=WBu$Z8q^VN7bdc03Esz#TM@h#>$4N`1WzzA|3DQbwm9$>!mv&0m zOYfHMmcA|hT6#8~i%*Xq7e6b0PW-(1OX3^im&UJ*UlV^@{NDH%;$MnC5dUiY!T2}g z567Q~KO;+!S!9K>k+RXUv9e-WsVpSxl&zFqExT5>TDDfUQMN_4Lw3LHLD^2(bF$ZD zU(0?-;1a9}wgg8)TEdWo5ebC}BNIj^lqJ+8%t@G^upr^m1Yg4LgeMb@CcKmIUBWMk zX^DdqU5UQL*2K2NKw>DdGm#~(NL-nCUE-d^eTn~0{7$Zyr^t)tljSw?Y4SSxbooqq zSiVkvqx@$1t?~`>+vRu5@0ahA@0Rb8KOuiw{;d2t`3v%wWYIw4|1#^-0}H2a=8?eVFu7(pO2RlvpWMnw3_iP3cgk zDbtl%%6w&kvPd~fIYv22S*@I+tWnNYx|JSfqq0pIP==I?l%2}e%C*XM${Umim8Vq_ zl|p4wrKl{bRMiElOjWLGl+!x%p-1pp%+-dGt?lv(-)N7WEbCE7dosZ&u%;-k`o+eW!Y-dcXQf^;7C+)Cbjv)JN3E)NiYgtG`vB zR{yU458T-ijY^}_7&Io0Rb$gQG-;Yl%?M4IW};@2rdo5c#-*v#OxJid0nKvF3e8H* zHJVkLHJbIBjhZ_&cWLg{+^>09vrDsEvsbfE^Q7i!%`=(oRpYx?Ekpu0U6$tJ2NT&DPD;U7~ByHR;-Pow^memAb2SYjoG? zuGihDyGgf6cc1P--A>&u-EQ3;-E+FO24H4uZuAT?+W27}39HdqZdLxy3vVWeTS zVXUFpFu_o1s4`48Of^h5v>KKgmKm7gO2bu#YYgiRw;47X?lf#NY&JY#*lBpgu-mZ5 z@Py$7!^?(O3-NuKEj~X8{ zK5pD^e9HKY@t?+HCX*@MlxG@YDm0BWjW&%n6`M*;7n@wBI@5I1Ow$~b+tgrcGA%W2 zFl{yMGkuqglP$?ZlCzR?l5>*_l8cf@C67s7oV+smn&efDbAFPl=_r#%FdJz%rf&JbGA9xoM$dD7nw(y z%gvSMD)VIXRP!9O$J}V<&6k>e=2ml?dA<2A^A7Vv=7-I@%#WM*n)jKXG{0zm&-|JB zbMu$xug!m0;w=dlxh2V>vY0ICmJ2OIEm@Y~mV8TrrN~ljnP8b?X|(t(Yb`fhc3EDw z9J9P-dE0W_a>DYZq2Xbb&++6^>XVK)@4>^ zU1h!1y4m`Gb*J?a>u&2F>l4-&tp}~|TEDh_YyIB(qxF>aXX`K4GuGczlTuZw>Qrs2 zKGm3-oN7*ma4&U8YF_H()TY#q)OD%%q&}5;)TXytY-zSk+ell9t=u-jHpzCet=2Z( zHq$oSw$8TQ_N?s{+cDcaw)bow*gm#>W;~g!(uD0v!2KzXBi+!WL z+rHht)4t#Soc%@n0sCwAqxQG#$L;UiKd^sp|I+@w{SSx45${NJBsp{rqa(#(b=Vw( z9Tz!r9pfAoj!H+hW2&RxG1D=};dXc&mpU$UT<%zrb|US|w3ANklsQ#Si*tx`s59G{ z>&$l+I!8GtI;)(Moi$FEv(7o)In%k!+2ef8c{&}X%hJ{9x^!#0Gkr*UVfx7Qvh<4d liRqKlUFkE@XQj_cpO@a2-k!cx47CUmKj|kip%+T;{C_FYMHc`7 literal 7864 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 diff --git a/Tests/TabletTests.swift b/Tests/TabletTests.swift index 2833a44..19436b3 100644 --- a/Tests/TabletTests.swift +++ b/Tests/TabletTests.swift @@ -82,11 +82,11 @@ class TabletTests: XCTestCase { XCTAssertNotNil(testController.tableDirector.tableView, "TableDirector should have table view") } - func testSimpleRowBuilder() { + func testSimpleRowBuilderCreatesRowsAndSection() { let source = ["1", "2", "3"] - let row = TableRowBuilder(items: source) + let rows = TableRowBuilder(items: source) .action(.configure) { data -> Void in XCTAssertNotNil(data.cell, "Action should have a cell") @@ -94,7 +94,7 @@ class TabletTests: XCTestCase { } testController.view.hidden = false - testController.tableDirector += row + testController.tableDirector += rows testController.tableView.reloadData() XCTAssertTrue(testController.tableView.dataSource?.numberOfSectionsInTableView?(testController.tableView) == 1, "Table view should have a section") @@ -109,7 +109,7 @@ class TabletTests: XCTestCase { } } - func testConfigurableRowBuilder() { + func testConfigurableRowBuilderCreatesRowsAndSection() { let testData = TestData(title: "title") @@ -122,4 +122,23 @@ class TabletTests: XCTestCase { XCTAssertNotNil(cell, "Cell should exists and should be TestTableViewCell") XCTAssertTrue(cell?.textLabel?.text == testData.title, "Cell's textLabel.text should equal to testData's title") } + + func testSectionBuilderCreatesSectionWithHeaderAndFooterTitles() { + + let row = TableConfigurableRowBuilder(items: [TestData(title: "title")]) + + let sectionHeaderTitle = "Header Title" + let sectionFooterTitle = "Footer Title" + + let section = TableSectionBuilder(headerTitle: sectionHeaderTitle, footerTitle: sectionFooterTitle, rows: [row]) + + testController.view.hidden = false + testController.tableDirector += section + + XCTAssertTrue(testController.tableView.dataSource?.numberOfSectionsInTableView?(testController.tableView) == 1, "Table view should have a section") + XCTAssertTrue(testController.tableView.dataSource?.tableView(testController.tableView, numberOfRowsInSection: 0) == 1, "Table view should have certain number of rows in a section") + + XCTAssertTrue(testController.tableView.dataSource?.tableView?(testController.tableView, titleForHeaderInSection: 0) == sectionHeaderTitle) + XCTAssertTrue(testController.tableView.dataSource?.tableView?(testController.tableView, titleForFooterInSection: 0) == sectionFooterTitle) + } } \ No newline at end of file From 1cf2bb1890f47bf7fd52d10d7ebc05ef7fbb5282 Mon Sep 17 00:00:00 2001 From: Max Sokolov Date: Sat, 19 Mar 2016 21:26:53 +0300 Subject: [PATCH 14/18] add test --- .../UserInterfaceState.xcuserstate | Bin 11619 -> 11845 bytes Tests/TabletTests.swift | 25 ++++++++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/Tablet.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate b/Tablet.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate index c6ec813bf47a3e3a59a71b40063da10462982fbd..61503527ed7e5d5a56f640e7fdb99dd40b175b24 100644 GIT binary patch delta 4046 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 diff --git a/Tests/TabletTests.swift b/Tests/TabletTests.swift index 19436b3..a578fcd 100644 --- a/Tests/TabletTests.swift +++ b/Tests/TabletTests.swift @@ -68,9 +68,9 @@ class TabletTests: XCTestCase { testController = TestController() } - + override func tearDown() { - + testController = nil super.tearDown() } @@ -141,4 +141,25 @@ class TabletTests: XCTestCase { XCTAssertTrue(testController.tableView.dataSource?.tableView?(testController.tableView, titleForHeaderInSection: 0) == sectionHeaderTitle) XCTAssertTrue(testController.tableView.dataSource?.tableView?(testController.tableView, titleForFooterInSection: 0) == sectionFooterTitle) } + + func testSectionBuilderCreatesSectionWithHeaderAndFooterViews() { + + let row = TableConfigurableRowBuilder(items: [TestData(title: "title")]) + + let sectionHeaderView = UIView() + let sectionFooterView = UIView() + + let section = TableSectionBuilder(headerView: sectionHeaderView, headerHeight: 44, footerView: sectionFooterView, footerHeight: 44) + section += row + + testController.view.hidden = false + testController.tableDirector += section + + XCTAssertTrue(testController.tableView.dataSource?.numberOfSectionsInTableView?(testController.tableView) == 1, "Table view should have a section") + XCTAssertTrue(testController.tableView.dataSource?.tableView(testController.tableView, numberOfRowsInSection: 0) == 1, "Table view should have certain number of rows in a section") + + XCTAssertTrue(testController.tableView.delegate?.tableView?(testController.tableView, viewForHeaderInSection: 0) == sectionHeaderView) + XCTAssertTrue(testController.tableView.delegate?.tableView?(testController.tableView, viewForFooterInSection: 0) == sectionFooterView) + + } } \ No newline at end of file From fdd74a650c67806a9a79a67931696e89c7116fc9 Mon Sep 17 00:00:00 2001 From: Max Sokolov Date: Sat, 19 Mar 2016 22:00:35 +0300 Subject: [PATCH 15/18] bugfixes, add tests --- .../UserInterfaceState.xcuserstate | Bin 11845 -> 13297 bytes Tablet/TableDirector.swift | 2 +- Tablet/TableRowBuilder.swift | 8 ++-- Tablet/Tablet.swift | 10 +++-- .../UserInterfaceState.xcuserstate | Bin 18529 -> 19700 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 5 +++ Tests/TabletTests.swift | 35 ++++++++++++++++++ 7 files changed, 51 insertions(+), 9 deletions(-) create mode 100644 Tablet/Tablet.xcodeproj/xcuserdata/maxsokolov.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist diff --git a/Tablet.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate b/Tablet.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate index 61503527ed7e5d5a56f640e7fdb99dd40b175b24..ecbfcfa52cfb59b6b4790f319dde0bc8d66c6cb0 100644 GIT binary patch delta 7873 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 i*e!L--AcFG9qO* : RowBuilder { // MARK: Triggers - public func invokeAction(actionType: ActionType, cell: UITableViewCell?, indexPath: NSIndexPath, itemIndex: Int, userInfo: [NSObject: AnyObject]? = nil) -> AnyObject? { + public func invokeAction(actionType: ActionType, cell: UITableViewCell?, indexPath: NSIndexPath, itemIndex: Int, userInfo: [NSObject: AnyObject]?) -> AnyObject? { if let action = actions[actionType.key] { - return action.invoke(ActionData(cell: cell as? C, indexPath: indexPath, item: items[itemIndex], itemIndex: itemIndex)) + return action.invoke(ActionData(cell: cell as? C, indexPath: indexPath, item: items[itemIndex], itemIndex: itemIndex, userInfo: userInfo)) } return nil } @@ -144,14 +144,14 @@ public class TableConfigurableRowBuilder AnyObject? { + public override func invokeAction(actionType: ActionType, cell: UITableViewCell?, indexPath: NSIndexPath, itemIndex: Int, userInfo: [NSObject: AnyObject]?) -> AnyObject? { switch actionType { case .configure: (cell as? C)?.configureWithItem(items[itemIndex]) default: break } - return super.invokeAction(actionType, cell: cell, indexPath: indexPath, itemIndex: itemIndex) + return super.invokeAction(actionType, cell: cell, indexPath: indexPath, itemIndex: itemIndex, userInfo: userInfo) } } diff --git a/Tablet/Tablet.swift b/Tablet/Tablet.swift index 0e71508..3a4eaa0 100644 --- a/Tablet/Tablet.swift +++ b/Tablet/Tablet.swift @@ -57,13 +57,15 @@ public class ActionData { public let item: I public let itemIndex: Int public let indexPath: NSIndexPath - - init(cell: C?, indexPath: NSIndexPath, item: I, itemIndex: Int) { - + public let userInfo: [NSObject: AnyObject]? + + init(cell: C?, indexPath: NSIndexPath, item: I, itemIndex: Int, userInfo: [NSObject: AnyObject]?) { + self.cell = cell self.indexPath = indexPath self.item = item self.itemIndex = itemIndex + self.userInfo = userInfo } } @@ -91,7 +93,7 @@ public class Action { public func invoke() { - NSNotificationCenter.defaultCenter().postNotificationName(TabletNotifications.CellAction, object: self) + NSNotificationCenter.defaultCenter().postNotificationName(TabletNotifications.CellAction, object: self, userInfo: userInfo) } } diff --git a/Tablet/Tablet.xcodeproj/project.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate b/Tablet/Tablet.xcodeproj/project.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate index 1d9a3e24c33e7440457d607808e545d54d4c0346..7e3b1326adbf6b56264f62b9ab1300b2ff92c527 100644 GIT binary patch literal 19700 zcmdUW2Y8d!`uI8DNZT}R)253w-RU6d%5DSQ0}7>7T1F`l(l*dY+teh5Rs_$7iipS( z1VxmVB~uUtL9T-HI#3zPa*K%LD&oZXf4_W9hZe8*cYn|Gd;ai1k~7}-ocFxv-KV~- z+3s>@Wt~PCQHVwiVv$I6i)h{?NTGyzRS zQ&1zap&4iSFK94WpxA8^%F}{Sq#9!en zl!)@7d?`OlO!-q1Du4>4f~YVmoKjHHR0@?!4W(36230^6QbklTRYH|gWz-02BvnI= zrzTJnsYz5VHJPfTtW-VKL^V?_)J;@7HJiGHnn!We0_ryEE@}z2oLWJxryimnrZ!Mr z)Glf_^(eK6+Dq-H4pUE3$EX*m*QnR2H>k7JIqE$1E_IRmnEH&mN_|6pOZ`IqO8rKQ zXek{|E9f{{NvG07>2z948)-A0N9WVU^muv#J&~S7*V2>eI(iD-MBC{b=~;9$-9g_% z&!ahd0lkpElfIi?Lf=QPq1V#)(+|)O(OvWodMCYy-bep~eu{pEex81veuF+upP}EQ zKcX+vm+4RG@96L8ALt+HYxM67!$_C_CXfkYq)a3;gpo5*Oe~YcBr_>YCX>Zz7%ih? zvYFw`C}uQM!Hi)lnXyb2Gl8jN8kk1L#h}9AFMIPclcCqs%epdFBP?W#$#;b>Uy zuoKxyY$I!9XRuDz#k$#cmSY#Nx3RagOW5V?3U)PnANwG?p6z0{vAfv4>;d)&dz5{F z{U`ex`#Spudy)N^y~KXPUS>aKKVv^25(#wo`Q@Y-$ElDpbEYzlJb^2mcabZ?bmd;?2hL)Fr{6oDeq5F|%YNP(gWOGLzn_!2)NCjMJdEQ&+%u!0Dr zL`otd-;(cOEi8$EzeyHpUVr#C*7{;ctJ~>lZnils#$rQpp}wpvy(FvDkgm@$l%!{u znvCfs29w@k$SNr* z$G6&VYPXd)!Zz(Q?63@JEDSGfaD!AG9HK=!q<0lH4o7pn)miSEV0YQ;n_)qbeSOyY zqJCXoB4(l-l)MdPAq~r zh>A!!kTH@BA<1MB$t5evy*yFF3tcWy8P-;JX`|ikaJnk2osM?5MJk2GR5v;1R9a`- zXIi1B4jO#F6-^0H!}nNZ~h6f-%;at#)^Nqpd2jfZK!kKPQnL-H2wP=E=hC zYX!EPBz(2Grc_p!*nyQCtyX7eH;ihTR9QXNqr1Ipa3JR&*5HOUB$D{Vg4PZFFm#~K zX_eJu+TA=g3Y|`C=SI|lZbmI22s}T9h1`PXS){VwfqmFFqFZ?UUbMHOJ5cgwL=cA- zpxe;xB!#4sp+rU0o6$maCt8H=LW@ZnDIw!Y2kGQ#8#k%J(P+zn6B=!IXY}$xMz!17 z-r#O`0`o^*X9$0I7OCPoy(PB#_L*>Y)wX6ZYHW?Ype@qq>r5$kx!P?m?`Bq_`%&^1 zbT3+kR-^mS8nl+AlMIqcvWSLgx1a~mI=DUs=ppnl(UD$>%r4%e&H!Hfw96 ztfzORJ*P2c2{p-X)AwLje?LG zXKMfvOgYYIg)4Sxeq>v+vv#H6wd$B}V; z9f>%J?@*HJ-UHFP;rfqr%qeQOH-n}wZg;sIExd+xw3fHdcFeLh7PdB4!|fRFvN_9J zXE;)a{xt((HP*s~$7whnXW&eng*9XXnMfv)S~8i`ZNWOM2i;kKO>mr3$W+jpxnz!T zpuB#Dd)hFo*wNDFw1MJuw0drjMH&HJ9$8f5w6?nJups_I+rWZ|C@C7zD-L+u0s6*( zFcj21uh7P}Hg}F|Z*2vUP}J;bnB`Gy18#IQkGN-KIY0p1ZW!GIO-gwWt_Y6=CdI|L z1efA6Jc3Lk7BZb!N&RMAjz{rk6&^zxNTbK3YT}tR1wfZ}*c#e-l9sm4wmTiIyxmsV z*vRh?1T-KTZR@m1!@OG@Ak!?;ByW3RGw9vMPJW@SWe#VhZBCW7-DPX^P{JbBz_^jt z*|u^}gLZ3kbEg+han*Pa>1OgyfM&h6_Xh|D6h$&I8PDA%jW25diLuyZSM@Hm7ux8e3p_$KVcF6<`F z#6fN%PU1d==im-le@9gY))WL+GpXnk(?Vu(eY#U8d#_jZ4q#0WA=JKE4(7I~;VO zCmzA;JpqqrJylk_vl|lx6#mOG-d!!=cSYLxO-!n3;u$hd9g^D-ln@fO)g>2 zvBMjAa{{*Kx!Q4{t>gMJOrBsS-Hexa^Tw0x*58Fc!Zz;3t1Qw~*v5b}>f6&e8!s~8 zW_g&S8?WZK^tZ=fN2vV`%gQSo?#CO!cfb#zHTXfi9zTR1#v5=K?j|>bp);4A+8s^OtZpst5b_1Cye1Edv_oqZ}m6a@fm!U+)bA778&n$^{NZrkx49Q zEAZIzUTp8+_XkY=0Dnl9l4am|z|=kmD6wE=+kknW;Lirk`y7z2=tJ7;Rte5oNhYsR zU70P`4wqw=quDV#6TGrn5Gl+YW6K<2cW1gizE!4hL4=P!MLodV!e8T`dEUE>c zyh}dec~8poji5GcPGQO6z5Dm*S5P6XjaFwPPZoZ#KpJ3!2|^@P_+8yz-vZirvhYh# z%rcl!Vw+)YZ+3ey2;k#-nyUEeE?$ifywW_IdKc8|M^0|`xYPY?Yf4Im0Jl)Vv_-j*2JUWFy(M zkxB$=CXvlR!54TQ8#(};N7Yt?m)|p%1BC zDv#_YkCKDr8B$E1CC`zhDZC6RvAV7N<*yUg)MFz=UQfotc?^)nm7b{25U;Ksq%X?b zSK0yR%bRz7>aot-H-20NxXEqp_09GMfz8uhj&^5**UzHLsY(>Gi5f+XrYfj0WDnU( z9wYlUQDdnpR6va*`^n?L(+BvIh^%tjTfo2f!mhEmfN5uKX@j8KAG&%B!r~^Y(+Zxh zbDXtxrfup-d!wzexmggWz({|X2=3&dtus z0e35FUOx+mnnF#*vnUHPlc&icFi4&t;TCD;;0B3cdt~&6g?hbvfh`(v`$npfvQab0 zVRD50qt_IHBfk-pb}@O9v`RrZdh8Q)$kS-%8+)24r$<{q#cOM?LrTp-{!|CmN!^U? zb&WkiM>wKdx0jUUC^<%uMOrokSje22`L_idoP?`Kym|aG;jlg0o|;dA(ISJ;j`!re zR$n*eu~i1^vPl0&-b`{YvH94E!1`XS8Py)nD+UR6in<*raR;_jcT$~vgty-6vVjej z;j}e_$uZjo7UlEgsIdIS)ZJj*0-3t0#i&I%o_qLPyOg|0AcPRs=YnfA+2D<5Yc#z+ zIJJ^mgOWE<_fo5<)zp3DCGs+Pg}l0nT1(we-AJt?$H^%;wKqx9qzc;%PyDZToPB1K z=i6jK$O(ehqwc*i!d_A96&l^tRvyhpY7@1Y+Cp9&JiLT7O8w-Z;uSCZgB7>N8Er;&vb_qa2Lq7Wk; zFvJ6$7efNs9>eV$`UKtM)InZ0A0Vf@;L3#a!aW$=G?$~f$5-b!?%m)K>M5_?Ks`;~ z>aiQBXCUB6Jxe`D&XDuHHUsq{^>TmpO}#?BO3spVB)*r(i3PWf?62{u6V&MeQ{JTB zA{WTpB);!BAQriNz?=)z+d?45yU6#b5BMFuPu}aIJ|ypZb~JdTl)A(({1fUj`G8#P zTlnYHmjhPu6?KJtNIrs9^y=%xf(4fctl~TB#{qM$Q9qH7$t7>d%ByAt`^bLOGxs$0 zJB?_J{Ami?X@+Jk(h#S^;T9N<*T9t?w>x5{t<~P{5-yU*h3;?*J&|pKH2zZ;xdNBx zGWq5$+K2W91b(!b_6H;s9Y{6PL1@e*$fSDw)(LG^@Lt_@4T7UDShaCpxpX~ERp)T> zAp?(R0GO_jtK`#uLYNMwLwbbpSL8E62z!{1jsTHLN76%RIr*G?LH;$UNWH#5rIS1Y z^~>uCR6%qO*fpI2`wm27upNydU&CUr5{P3%YKhi?{Gb^i6L`!J*QQN$wh&(E)dyfI z^7IyRHUp2Po6h0=AwC-McZLfXhS9?<(!{?prJK&>q5qwsUfHMT!;c!ho|kBki#GGcPg|9Z2ehn4tuNH<;fsH^a#Sg@*bnJpT*;X*a}E) z*A&k%n-B;D0K!iQB!TRL=#Yn*EYhqBtIN&Ds~`_zYwR;Eg=s~gBN{yuA!7sPEJ!{G z3VXGSknaKk7%BK!19cC-h8`h7Po?WYRMXRF3q75-lHWOuI1IUVY7^Z+H_|qG28U@5 z$8vZghdm~5%3o=AbyZFWU%gP>-o~%>kJ@m+7>o38YEEFgzgkR% zW2ToN-tD%~PJX+sw1aM=Z{je+VG)OYIV|2pyJ$DvPS57Bgu^lpM{pRjOZ}8HJ(pL+ z90u_;;y<-W26$Y2v@^p~@6jJR5up26r1}3TbdS9=IMh1?sE|@C_)nnG6L$=n$XEk!XQe_>k?V=y#a7a%Gf_~T&cJOjrH@#)>Z9GD6>7Gb0VrOe zA;B})S-eUg=TRs)9Q|)Lae~JHLu0%c-W-78EPVm87W6s#Jcr{roX}0bO~1ooC5Itf z*Z+!qC~zIPU)leb>-tAG+!-Bw7PAdRP=9cr2;dU`%lq61JkxvdpV43OV&-%D3;JL5 zmmE&wa59HeIGnnPzCwRZU!}j{@K6rxIIQPz9#6j10U}Tkp&5dES^+XO!^KA;j&@g#)j8AFBY{1MJV6!?vdpJi2lI6Tm6at z#cK-Fzj9dBV+%6~OiBhb6o=Iu&gwNP8J6({1CbFiJ{(TtaC$f6$A~$c!Qsrmk%EV` zY9CE{V>NtAq0iq>ENGnG-zH^(nb1F=3}eDMtl_Yh#6wblp)ee*&OdL{V<9mLupXFb z4jYL3G!qA2EBLNVJd?mAGRj()$1Q=71BbIYY~rwy!?_k|&i|A}GkGuHo&UkDKlRX< zNoCYOuXIo*TV+)qrHpHVax;k5hj-@h8!1@$K*2wOd(Um;Q|g9au~i8bGT$PQ^J%o zWy}a>B!^2mT*l!s9IoW>1pa!Y55mM=p6@X&1UmFE{r_**3DS)NcF5~QVMAVe-oWsM zFCKS}so@|+m?ZG#ME;^pVrn@IbQ|4w(WWq#{+<{!ow0JboWrAdU+nMPB3r?LTQq~Q z_lJk9%q#+CVFh2bvTTuO=%CCetP(O>T?`mpWBcDAH`7jk!hoE=fx}fCPK0~I^ZwcU zOf84J+rF8Z$MgPN<`xc*<8XC1GoQJY!$5)Y{|WDV!7XI&9LSZ6nfp-k4(4uV33Cs# zlv&0sXI3yPnR}U4%xVr#;_ze+PvP)14o~NBJ%<}P3?^|Chi~L?^A2VWvzED^d4O5R zJjkqP9%3G5HZWZr23Y`xuUl~``@`)f5ETbqaJVrSi;g#fHGT&TxE8jBT!B&3Y@Ei_z z@LPdeMvqlhQf#R3fYh6^=1mZ))w}?IWhoxuZ_Mv3Vljv3au{^ZJPyy_#L_H-3Rnmg zfa)PUK<@vRHa8Eu^ym?RHU^$H27Puv+OSeK?7CYCXCnmK+{R%j3+ScIoQ@OstefZ| zx6VssHik_EK!3`Ju}U@x=m8GRLJr@_16d>x_+0XWiUU*T>a|)pD~$o_|7z#zv$F;) zE}exsu0dexSUtc5<9RWM@8)4H>4BL-{jj%|Uzk>}GXOx1&S2=j+u>~Cpa6^5VgLxH z_cGHvJZ23 zD{;TcXEWJuY7V=R-2^fASJ`FkBT(&N^VAu8iVHn?sakl*VC&%P$~e58AYTrHx%kK_ zc00QRAT(3W>`p%YUENbdWMxIsd z^Ii&Uu z5GAyKhnLFW9tq8!Y?2%FzNdb^r%?b>W^J)I^EI3O0r08EWWrmW(kGEG@d z*@TX4qs6G7V6WmW-&*0rn5OZb%~ke$2o18|u-~%ZarhXApW*Pc8`&S&A9)w;ISzl| z@zNld0cc1XX1l7mYHb^q^z5`V9{PpM_*5(WR6AOGj z&NXU4aY+=48_4gX2vO8v8&Qa&MKK&c&f(WM{5nYQ0s#oRA#S|K!0$Ojky4a8*!-a) zl?VcNCpZjo+f)2}sQ_S{`Hw5mhzx^4Fp5l~Y!1K4;kP(^1|Z~L8L*F&qFm%J$`j@D zB@d0@tBnn&to5F>2t0$u6wR=rVZ;C4^VeNIzCluXltP)L*62+=59j>E{*r(|cze@B zOyPYFlnWQSp*Fg{9o#&4q$VMBZFPG?gUtqyK~4pSh-KkJ26<-J9U4X$!gfbQ!pk>5 z;yamBMr5ai|W}BL}((xllX072X;xg~vM&!qc1$ z@T_<2NTX<9MuuqJKR+7%s;ZxDuWUkB2(% z=}^w?#O?TIco4i2Z^ei35qwObGKGatctJPd4}O-zXFcjrR46K%+FLo!hYB`AQ!#1* zI`hB0*P~PfS>i1qCq{@yio~K(qR}2{ah}5$KwxnAZ4SS)MI@na6pa;CK@H7~AUw#E z9DbL>??Wlgle`E?`0Kkalp6e-L9iwe@_d$kpyV4MjQBy-?oR$i;=dWmm#cY3o)p!> zEu1W><9VL1yyD%YbE@aDio@>-l$t7Y0Dv^29Y%Syr@OgDj0>0o;Vsr(|}gZknZ8|MGjvQj71R8 zeE|niyI|OT{J$9!5Zx>Q{p5ckBRa@65X~3eI^I*?=(!0)Py#%{H$YWvJ|lz2)5%N* zlLO)JQV4UG!$avRW*k!k!OfKrINZ(bfoIVB;UV-B%wc#4{R(p&9zdU9PQe4{Gw=lZ z0z7P1vt!x$>;`y}dZW65(?GT+8{Y&(VkJv}z6W|l?li{QB(fJsCvVF`xl|B=Frua59f26&kCPSKAU}Z`yBLn#^)8Evp(*Fi+ z9panno9S!vE%2S-JJt6_-*(?QzMZ~vedqb!>bux?iSJV1<-RL@SNY!Od&u{U@ArOU zKb4=!uf(s+Z=~NSzY4!fzbe0}eilEgUxS~`Z>FE!Z5NC0;CEDPAkyEPh11 zUA#;DsCcjVDe=?dqvB`8&x+5BKM{W>{zCkf_-pYu{!j(u&-(lNgUaw9;;-6S29mR zBnu?BOIAo$N$!)}FIgv9FWD~HC3#fxm}I}?faF=p3zC0IUXdJ^ydJ;=L`9|D=cpupfjSzuUT zMBtD>Wngk(YM?4GEifZ6D{yk4Gw^}H*8;x^{4K~QND>qnBn=7)iV4yLnS(|IRR+}r zO%0kJR3FqB)ETrSXkF0mpqGPQ4SFr;ji8f3r=`BqV5wZHkj6;kqzO``R3jZOEs~Z< z%cLWvyQK%EZ%Hpme+u>q_6zn84hRkpP7F>8P6-|wYz)p0HU|$6o)$baxH-5zcz*D< z;N8LJg0F)`dJ8@>IxMA)m=avM8BWHcU2LmM0q_8z~zltCrQsCde$Z>9Ts+ELpRxRW?^P zUq)oN$?lNdDO)aEBfDR=PPSh5uxzJnuWX;}aoJ(n5!q9+qq0-7w`HHozLZ^&U6uVH zyC(Zt_G_qrXlQ7BXmV(3s46rwR1>NTHH3}~T^9Oa=%b-~L-&O~9(pkJQ0SAP{|J3L z^jPTW(6>U*hMo_7JM`Vq_d`Dny%>5a^m6FWVWD9OVL4$XVUxq=g{=sCFl<}c&amBK zd&BmHJs$Q>*k@t?3i~STYS_17--rDi?i(Hy9vm(U4+~d>$Arg)Cxk1*tHPV0nEtNt zCE-iMmxr$p-xO!rHCsLzeOfTW=0N=EQ_p* zoEm9~v_>{W+9KCPZiw6(xh-->&neU%6DSkjKd58O839gliF>O|D3sQ05jj`}3()2J__u0&mp`ZnrUg-9V&L@MM8g(6;&s7O+zC^QPQ zVuWI(qFgarF-cLUn5vkrs8=*9Iux8@p<d~O4#h6TLB&zU zam7i+X~kQL3yOCX?^>G{GHpXpTbZ;5Y?Z;$VYpBq0v zo{L``e^31K_a=5ZsS*9#kRw%2L65&`6Wq`f|Ej%B9ewAB`2jOsglx@nv&X+<|K6{-IDY|(y64klio}EFzMr@%Sm4+ zeVg<{(oadhCjFkQO0G>_l)N|jspMnH&nCZ+{8I8O$)}UgCBL2gUh)UYUnYN({C)DZ zvA2~9~!8J$v-VojNmVozyKxhch+GAE@o<>r*zQr4z)rEE&snzAkBaLRKj zFQ&Ylay;dYR7q-BYC>vCswy=-Rhw!^%}zC^7N(9&otoO1+LC%t>Z;WJsV}FVNj;l- zF7-m{<GqiGO=g>!no>3u{T$Q3ysnS%L zDy>Sd%2gGqN>w9Oqf`@BQ&iJb(^WQAlWLZ#MYTfpfNHC1r)sxqkLq#NLDgZ^5!Lgm z^Qw9X{&^vLu#(%(scFa3k`iy7LC z{EWhk;*7G4wHcc;wq|V0*qQNNCY8x#iZcB&M`cdTtj(;;oR+yIb6@7;nFliuXNj_8 zSz%cbS@JAPR&!Q+R!7#{tod17*5a&tvX*D9%vznbChM`Rb6KBgf;5quc#TS9(iCWl zHD#J|O@(H>W|F2(GgUKPQ?Hq&ackyk7HL*!R%zB~9?-1UY|(7f?9}Ym?A7ekyr%h1 zOKa6yy*5`{rmfaa(OR_iTAQ{>dz03!oulp4-lCnay;HkP`=EBScB^)qc87MC_JH<~ z_K5Z=?J@1M+E=ybv>$1&Xs>C1*8ZyfU59mIU4Txi3(TdjLY*QMK}+p62H+owCAJEVJ3_mu9a?j_wR-TS&v zbzkVd(p}Ykr~6Hh^^9Jm_tX39L-o;mm0qVeK-4rxKTKbuAE6(muh5Ux-=LqYZ`8Ny z=jw0QFVrv6FV-*7uhy^CuhXyBZ_sz^cj%wcKcjzLe_DS=e_sEd{zLu8`cL%V>c7|j zsQ=lJWym$;8ww32hEBsm!(E0YhGmA8hE;|=hC_xUhNlh33~w1eHGE_E-teR0n&B72 z??#C+&ZsjQjrqpW#wz0!qs=(qc!%*J<9_2Y<8#IrjV~LI8(%k`HC`~jYkc4Mo$*KG zPsX2(znQQp&=hQnF~ysdrWBLPlx8xU3Qd(Ji>cmZGc}oJnOaRZncSv1rbVW^P4}3V znO2%so7S4vnbw;gHf=NQHyt-!G+oOM%udeE&#uW{o&8|;#_V0$hqI4mKbQSt_RHBP zvQKB9$v&U`c1}=^DyKN7B4=XG0X?zR5h_e200F`EK)4^J?>2 z^E&fG<_+d;=AGt!=A-5p%`cmeo8K^>F`qZTV}9TKq4{(3RrAlo=-j5DfiXf*K$wfp3Z$M_iXO@+~4z*d6jt`d0gIIc`Nf) z=RK6SId6O3p}Z&ap38eN@1?v~@=oV{n)gNCS9w?SzRUYD@8`VV@^Lza`(1@63NZ|Hb@Q^H28p;*{_yA_H7;lz;mF0iU6;E&u=k literal 18529 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 oe`WrK{44oC + + diff --git a/Tests/TabletTests.swift b/Tests/TabletTests.swift index a578fcd..4d5c7b9 100644 --- a/Tests/TabletTests.swift +++ b/Tests/TabletTests.swift @@ -39,6 +39,9 @@ struct TestData { struct TestTableViewCellOptions { static let ReusableIdentifier: String = "ReusableIdentifier" + static let CellAction: String = "CellAction" + static let CellActionUserInfoKey: String = "CellActionUserInfoKey" + static let CellActionUserInfoValue: String = "CellActionUserInfoValue" static let EstimatedHeight: Float = 255 } @@ -57,6 +60,10 @@ class TestTableViewCell: UITableViewCell, ConfigurableCell { func configureWithItem(item: Item) { textLabel?.text = item.title } + + func raiseAction() { + Action(key: TestTableViewCellOptions.CellAction, sender: self, userInfo: [TestTableViewCellOptions.CellActionUserInfoKey: TestTableViewCellOptions.CellActionUserInfoValue]).invoke() + } } class TabletTests: XCTestCase { @@ -134,6 +141,7 @@ class TabletTests: XCTestCase { testController.view.hidden = false testController.tableDirector += section + testController.tableView.reloadData() XCTAssertTrue(testController.tableView.dataSource?.numberOfSectionsInTableView?(testController.tableView) == 1, "Table view should have a section") XCTAssertTrue(testController.tableView.dataSource?.tableView(testController.tableView, numberOfRowsInSection: 0) == 1, "Table view should have certain number of rows in a section") @@ -154,12 +162,39 @@ class TabletTests: XCTestCase { testController.view.hidden = false testController.tableDirector += section + testController.tableView.reloadData() XCTAssertTrue(testController.tableView.dataSource?.numberOfSectionsInTableView?(testController.tableView) == 1, "Table view should have a section") XCTAssertTrue(testController.tableView.dataSource?.tableView(testController.tableView, numberOfRowsInSection: 0) == 1, "Table view should have certain number of rows in a section") XCTAssertTrue(testController.tableView.delegate?.tableView?(testController.tableView, viewForHeaderInSection: 0) == sectionHeaderView) XCTAssertTrue(testController.tableView.delegate?.tableView?(testController.tableView, viewForFooterInSection: 0) == sectionFooterView) + } + + func testRowBuilderCustomActionInvokedAndSentUserInfo() { + + let expectation = expectationWithDescription("cell action") + + let row = TableConfigurableRowBuilder(items: [TestData(title: "title")]) + .action(TestTableViewCellOptions.CellAction) { data -> Void in + + XCTAssertNotNil(data.cell, "Action data should have a cell") + XCTAssertNotNil(data.userInfo, "Action data should have a user info dictionary") + XCTAssertTrue(data.userInfo?[TestTableViewCellOptions.CellActionUserInfoKey] as? String == TestTableViewCellOptions.CellActionUserInfoValue, "UserInfo should have correct value for key") + + expectation.fulfill() + } + + testController.view.hidden = false + testController.tableDirector += row + testController.tableView.reloadData() + let cell = testController.tableView.cellForRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0)) as? TestTableViewCell + + XCTAssertNotNil(cell, "Cell should exists and should be TestTableViewCell") + + cell?.raiseAction() + + waitForExpectationsWithTimeout(1.0, handler: nil) } } \ No newline at end of file From 54551ef77e94cc4867d785d7b827903d73f3bd6d Mon Sep 17 00:00:00 2001 From: Max Sokolov Date: Sun, 20 Mar 2016 09:26:58 +0300 Subject: [PATCH 16/18] setup new demo project --- Tablet.xcworkspace/contents.xcworkspacedata | 3 + .../UserInterfaceState.xcuserstate | Bin 13297 -> 16227 bytes Tablet/TableDirector.swift | 2 +- .../UserInterfaceState.xcuserstate | Bin 19700 -> 19773 bytes .../ViewControllers/MainViewController.swift | 1 + .../AppIcon.appiconset/Contents.json | 0 .../{TabletDemo => Resources}/Info.plist | 0 .../Storyboards/LaunchScreen.storyboard | 5 +- .../Resources/Storyboards/Main.storyboard | 117 +---------- .../TabletDemo.xcodeproj/project.pbxproj | 190 +----------------- .../UserInterfaceState.xcuserstate | Bin 57640 -> 35030 bytes .../ConfigurableTableViewCell.swift | 39 ---- .../TabletDemo/CustomTableActions.swift | 20 -- .../TabletDemo/MyNibTableViewCell.swift | 15 -- TabletDemo/TabletDemo/MyNibTableViewCell.xib | 23 --- TabletDemo/TabletDemo/MyTableViewCell.swift | 19 -- TabletDemo/TabletDemo/ViewController.swift | 72 ------- 17 files changed, 21 insertions(+), 485 deletions(-) rename TabletDemo/{TabletDemo => Resources/Assets}/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename TabletDemo/{TabletDemo => Resources}/Info.plist (100%) delete mode 100644 TabletDemo/TabletDemo/ConfigurableTableViewCell.swift delete mode 100644 TabletDemo/TabletDemo/CustomTableActions.swift delete mode 100644 TabletDemo/TabletDemo/MyNibTableViewCell.swift delete mode 100644 TabletDemo/TabletDemo/MyNibTableViewCell.xib delete mode 100644 TabletDemo/TabletDemo/MyTableViewCell.swift delete mode 100644 TabletDemo/TabletDemo/ViewController.swift diff --git a/Tablet.xcworkspace/contents.xcworkspacedata b/Tablet.xcworkspace/contents.xcworkspacedata index 64eb7dc..8a2fad4 100644 --- a/Tablet.xcworkspace/contents.xcworkspacedata +++ b/Tablet.xcworkspace/contents.xcworkspacedata @@ -4,4 +4,7 @@ + + diff --git a/Tablet.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate b/Tablet.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate index ecbfcfa52cfb59b6b4790f319dde0bc8d66c6cb0..1fef06ba080bf7765c84906d1a4d0237192fb3d4 100644 GIT binary patch literal 16227 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 delta 7743 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 UZPnC?P}L{XtLn4*e?-v#0f-bKAOHXW diff --git a/Tablet/TableDirector.swift b/Tablet/TableDirector.swift index d3a356b..1c5013d 100644 --- a/Tablet/TableDirector.swift +++ b/Tablet/TableDirector.swift @@ -85,7 +85,7 @@ public class TableDirector: NSObject, UITableViewDataSource, UITableViewDelegate } public extension TableDirector { - + // MARK: UITableViewDataSource - configuration func numberOfSectionsInTableView(tableView: UITableView) -> Int { diff --git a/Tablet/Tablet.xcodeproj/project.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate b/Tablet/Tablet.xcodeproj/project.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate index 7e3b1326adbf6b56264f62b9ab1300b2ff92c527..fbea635a0c0021a021bbf4092872841a02f23437 100644 GIT binary patch delta 6898 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 diff --git a/TabletDemo/Classes/Presentation/Main/ViewControllers/MainViewController.swift b/TabletDemo/Classes/Presentation/Main/ViewControllers/MainViewController.swift index 6677dd7..3831c57 100644 --- a/TabletDemo/Classes/Presentation/Main/ViewControllers/MainViewController.swift +++ b/TabletDemo/Classes/Presentation/Main/ViewControllers/MainViewController.swift @@ -8,6 +8,7 @@ import Foundation import UIKit +import Tablet class MainViewController : UITableViewController { diff --git a/TabletDemo/TabletDemo/Assets.xcassets/AppIcon.appiconset/Contents.json b/TabletDemo/Resources/Assets/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from TabletDemo/TabletDemo/Assets.xcassets/AppIcon.appiconset/Contents.json rename to TabletDemo/Resources/Assets/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/TabletDemo/TabletDemo/Info.plist b/TabletDemo/Resources/Info.plist similarity index 100% rename from TabletDemo/TabletDemo/Info.plist rename to TabletDemo/Resources/Info.plist diff --git a/TabletDemo/Resources/Storyboards/LaunchScreen.storyboard b/TabletDemo/Resources/Storyboards/LaunchScreen.storyboard index ffacbd6..c9b7564 100644 --- a/TabletDemo/Resources/Storyboards/LaunchScreen.storyboard +++ b/TabletDemo/Resources/Storyboards/LaunchScreen.storyboard @@ -1,8 +1,8 @@ - + - + @@ -16,7 +16,6 @@ - diff --git a/TabletDemo/Resources/Storyboards/Main.storyboard b/TabletDemo/Resources/Storyboards/Main.storyboard index d299801..2cf7895 100644 --- a/TabletDemo/Resources/Storyboards/Main.storyboard +++ b/TabletDemo/Resources/Storyboards/Main.storyboard @@ -5,99 +5,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -107,7 +14,7 @@ - + @@ -125,25 +32,7 @@ - - - - - - - - - - - - - - - - - - - + @@ -161,7 +50,7 @@ - + diff --git a/TabletDemo/TabletDemo.xcodeproj/project.pbxproj b/TabletDemo/TabletDemo.xcodeproj/project.pbxproj index 4d8e6af..4d330c4 100644 --- a/TabletDemo/TabletDemo.xcodeproj/project.pbxproj +++ b/TabletDemo/TabletDemo.xcodeproj/project.pbxproj @@ -7,54 +7,21 @@ objects = { /* Begin PBXBuildFile section */ - 508B71841BF48DD300272920 /* TableSectionBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508B71831BF48DD300272920 /* TableSectionBuilder.swift */; }; - 508B71861BF48E0D00272920 /* TableRowBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508B71851BF48E0D00272920 /* TableRowBuilder.swift */; }; - DA1BCD0F1BF5472C00CC0479 /* TableDirector.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA1BCD0E1BF5472C00CC0479 /* TableDirector.swift */; }; - DA1BCD111BF7388C00CC0479 /* CustomTableActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA1BCD101BF7388C00CC0479 /* CustomTableActions.swift */; }; - DAB7EB2D1BEF787300D2AD5E /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAB7EB2C1BEF787300D2AD5E /* ViewController.swift */; }; - DAB7EB321BEF787300D2AD5E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DAB7EB311BEF787300D2AD5E /* Assets.xcassets */; }; - DAB7EB3E1BEF78A400D2AD5E /* Tablet.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAB7EB3D1BEF78A400D2AD5E /* Tablet.swift */; }; - DAB7EB401BEFD07E00D2AD5E /* ConfigurableTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAB7EB3F1BEFD07E00D2AD5E /* ConfigurableTableViewCell.swift */; }; DAC2D5CA1C9D303E009E9C19 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC2D5C91C9D303E009E9C19 /* AppDelegate.swift */; }; DAC2D5CF1C9D30A7009E9C19 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DAC2D5CD1C9D30A7009E9C19 /* Main.storyboard */; }; DAC2D5D01C9D30A7009E9C19 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DAC2D5CE1C9D30A7009E9C19 /* LaunchScreen.storyboard */; }; DAC2D5D41C9D3118009E9C19 /* MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC2D5D31C9D3118009E9C19 /* MainViewController.swift */; }; - DAC2D5E61C9D6493009E9C19 /* TabletTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC2D5D61C9D638F009E9C19 /* TabletTests.swift */; }; - DAED08F11C14DE7E006C04D8 /* MyTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAED08F01C14DE7E006C04D8 /* MyTableViewCell.swift */; }; - DAF003961C14DC0C0028C3D6 /* MyNibTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAF003951C14DC0C0028C3D6 /* MyNibTableViewCell.swift */; }; - DAF003981C14DC250028C3D6 /* MyNibTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = DAF003971C14DC250028C3D6 /* MyNibTableViewCell.xib */; }; + DAC2D69C1C9E75E3009E9C19 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DAC2D69B1C9E75E3009E9C19 /* Assets.xcassets */; }; /* End PBXBuildFile section */ -/* Begin PBXContainerItemProxy section */ - DAC2D5E11C9D6433009E9C19 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DAB7EB1F1BEF787300D2AD5E /* Project object */; - proxyType = 1; - remoteGlobalIDString = DAB7EB261BEF787300D2AD5E; - remoteInfo = TabletDemo; - }; -/* End PBXContainerItemProxy section */ - /* Begin PBXFileReference section */ - 508B71831BF48DD300272920 /* TableSectionBuilder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableSectionBuilder.swift; sourceTree = ""; }; - 508B71851BF48E0D00272920 /* TableRowBuilder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableRowBuilder.swift; sourceTree = ""; }; - DA1BCD0E1BF5472C00CC0479 /* TableDirector.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableDirector.swift; sourceTree = ""; }; - DA1BCD101BF7388C00CC0479 /* CustomTableActions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomTableActions.swift; sourceTree = ""; }; DAB7EB271BEF787300D2AD5E /* TabletDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TabletDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; - DAB7EB2C1BEF787300D2AD5E /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - DAB7EB311BEF787300D2AD5E /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - DAB7EB361BEF787300D2AD5E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - DAB7EB3D1BEF78A400D2AD5E /* Tablet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Tablet.swift; sourceTree = ""; }; - DAB7EB3F1BEFD07E00D2AD5E /* ConfigurableTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConfigurableTableViewCell.swift; sourceTree = ""; }; DAC2D5C91C9D303E009E9C19 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; DAC2D5CD1C9D30A7009E9C19 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = ""; }; DAC2D5CE1C9D30A7009E9C19 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; }; DAC2D5D31C9D3118009E9C19 /* MainViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainViewController.swift; sourceTree = ""; }; - DAC2D5D61C9D638F009E9C19 /* TabletTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TabletTests.swift; sourceTree = ""; }; - DAC2D5DC1C9D6433009E9C19 /* TabletTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TabletTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - DAED08F01C14DE7E006C04D8 /* MyTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MyTableViewCell.swift; sourceTree = ""; }; - DAF003951C14DC0C0028C3D6 /* MyNibTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MyNibTableViewCell.swift; sourceTree = ""; }; - DAF003971C14DC250028C3D6 /* MyNibTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MyNibTableViewCell.xib; sourceTree = ""; }; + DAC2D69B1C9E75E3009E9C19 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + DAC2D69D1C9E78B5009E9C19 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -65,24 +32,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - DAC2D5D91C9D6433009E9C19 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ DAB7EB1E1BEF787300D2AD5E = { isa = PBXGroup; children = ( - DAB7EB3C1BEF789500D2AD5E /* Tablet */, DAC2D5C61C9D2FE5009E9C19 /* Classes */, DAC2D5CB1C9D3058009E9C19 /* Resources */, - DAC2D5D51C9D635F009E9C19 /* Tests */, - DAB7EB291BEF787300D2AD5E /* TabletDemo */, DAB7EB281BEF787300D2AD5E /* Products */, ); sourceTree = ""; @@ -91,46 +48,10 @@ isa = PBXGroup; children = ( DAB7EB271BEF787300D2AD5E /* TabletDemo.app */, - DAC2D5DC1C9D6433009E9C19 /* TabletTests.xctest */, ); name = Products; sourceTree = ""; }; - DAB7EB291BEF787300D2AD5E /* TabletDemo */ = { - isa = PBXGroup; - children = ( - DAC2D5C41C9D2F5C009E9C19 /* Presentation */, - DAB7EB2C1BEF787300D2AD5E /* ViewController.swift */, - DAB7EB3F1BEFD07E00D2AD5E /* ConfigurableTableViewCell.swift */, - DA1BCD101BF7388C00CC0479 /* CustomTableActions.swift */, - DAF003951C14DC0C0028C3D6 /* MyNibTableViewCell.swift */, - DAF003971C14DC250028C3D6 /* MyNibTableViewCell.xib */, - DAED08F01C14DE7E006C04D8 /* MyTableViewCell.swift */, - DAB7EB311BEF787300D2AD5E /* Assets.xcassets */, - DAB7EB361BEF787300D2AD5E /* Info.plist */, - ); - path = TabletDemo; - sourceTree = ""; - }; - DAB7EB3C1BEF789500D2AD5E /* Tablet */ = { - isa = PBXGroup; - children = ( - DAB7EB3D1BEF78A400D2AD5E /* Tablet.swift */, - DA1BCD0E1BF5472C00CC0479 /* TableDirector.swift */, - 508B71851BF48E0D00272920 /* TableRowBuilder.swift */, - 508B71831BF48DD300272920 /* TableSectionBuilder.swift */, - ); - name = Tablet; - path = ../Tablet; - sourceTree = ""; - }; - DAC2D5C41C9D2F5C009E9C19 /* Presentation */ = { - isa = PBXGroup; - children = ( - ); - name = Presentation; - sourceTree = ""; - }; DAC2D5C61C9D2FE5009E9C19 /* Classes */ = { isa = PBXGroup; children = ( @@ -159,6 +80,8 @@ DAC2D5CB1C9D3058009E9C19 /* Resources */ = { isa = PBXGroup; children = ( + DAC2D69D1C9E78B5009E9C19 /* Info.plist */, + DAC2D69A1C9E75BE009E9C19 /* Assets */, DAC2D5CC1C9D306C009E9C19 /* Storyboards */, ); path = Resources; @@ -189,13 +112,12 @@ path = ViewControllers; sourceTree = ""; }; - DAC2D5D51C9D635F009E9C19 /* Tests */ = { + DAC2D69A1C9E75BE009E9C19 /* Assets */ = { isa = PBXGroup; children = ( - DAC2D5D61C9D638F009E9C19 /* TabletTests.swift */, + DAC2D69B1C9E75E3009E9C19 /* Assets.xcassets */, ); - name = Tests; - path = ../Tests; + path = Assets; sourceTree = ""; }; /* End PBXGroup section */ @@ -218,24 +140,6 @@ productReference = DAB7EB271BEF787300D2AD5E /* TabletDemo.app */; productType = "com.apple.product-type.application"; }; - DAC2D5DB1C9D6433009E9C19 /* TabletTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = DAC2D5E31C9D6433009E9C19 /* Build configuration list for PBXNativeTarget "TabletTests" */; - buildPhases = ( - DAC2D5D81C9D6433009E9C19 /* Sources */, - DAC2D5D91C9D6433009E9C19 /* Frameworks */, - DAC2D5DA1C9D6433009E9C19 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - DAC2D5E21C9D6433009E9C19 /* PBXTargetDependency */, - ); - name = TabletTests; - productName = TabletTests; - productReference = DAC2D5DC1C9D6433009E9C19 /* TabletTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -250,10 +154,6 @@ CreatedOnToolsVersion = 7.0.1; DevelopmentTeam = Z48R734SJX; }; - DAC2D5DB1C9D6433009E9C19 = { - CreatedOnToolsVersion = 7.2; - TestTargetID = DAB7EB261BEF787300D2AD5E; - }; }; }; buildConfigurationList = DAB7EB221BEF787300D2AD5E /* Build configuration list for PBXProject "TabletDemo" */; @@ -270,7 +170,6 @@ projectRoot = ""; targets = ( DAB7EB261BEF787300D2AD5E /* TabletDemo */, - DAC2D5DB1C9D6433009E9C19 /* TabletTests */, ); }; /* End PBXProject section */ @@ -282,15 +181,7 @@ files = ( DAC2D5CF1C9D30A7009E9C19 /* Main.storyboard in Resources */, DAC2D5D01C9D30A7009E9C19 /* LaunchScreen.storyboard in Resources */, - DAF003981C14DC250028C3D6 /* MyNibTableViewCell.xib in Resources */, - DAB7EB321BEF787300D2AD5E /* Assets.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DAC2D5DA1C9D6433009E9C19 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( + DAC2D69C1C9E75E3009E9C19 /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -301,38 +192,13 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 508B71841BF48DD300272920 /* TableSectionBuilder.swift in Sources */, DAC2D5D41C9D3118009E9C19 /* MainViewController.swift in Sources */, - DAB7EB2D1BEF787300D2AD5E /* ViewController.swift in Sources */, - DAB7EB3E1BEF78A400D2AD5E /* Tablet.swift in Sources */, - DAED08F11C14DE7E006C04D8 /* MyTableViewCell.swift in Sources */, - DAF003961C14DC0C0028C3D6 /* MyNibTableViewCell.swift in Sources */, - 508B71861BF48E0D00272920 /* TableRowBuilder.swift in Sources */, - DA1BCD0F1BF5472C00CC0479 /* TableDirector.swift in Sources */, - DAB7EB401BEFD07E00D2AD5E /* ConfigurableTableViewCell.swift in Sources */, DAC2D5CA1C9D303E009E9C19 /* AppDelegate.swift in Sources */, - DA1BCD111BF7388C00CC0479 /* CustomTableActions.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DAC2D5D81C9D6433009E9C19 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - DAC2D5E61C9D6493009E9C19 /* TabletTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ -/* Begin PBXTargetDependency section */ - DAC2D5E21C9D6433009E9C19 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DAB7EB261BEF787300D2AD5E /* TabletDemo */; - targetProxy = DAC2D5E11C9D6433009E9C19 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - /* Begin XCBuildConfiguration section */ DAB7EB371BEF787300D2AD5E /* Debug */ = { isa = XCBuildConfiguration; @@ -421,7 +287,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - INFOPLIST_FILE = TabletDemo/Info.plist; + INFOPLIST_FILE = Resources/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.tablet.tablet; @@ -436,7 +302,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - INFOPLIST_FILE = TabletDemo/Info.plist; + INFOPLIST_FILE = Resources/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.tablet.tablet; @@ -445,32 +311,6 @@ }; name = Release; }; - DAC2D5E41C9D6433009E9C19 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - INFOPLIST_FILE = TabletTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.2; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.tablet.TabletTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TabletDemo.app/TabletDemo"; - }; - name = Debug; - }; - DAC2D5E51C9D6433009E9C19 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - INFOPLIST_FILE = TabletTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.2; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.tablet.TabletTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TabletDemo.app/TabletDemo"; - }; - name = Release; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -492,14 +332,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - DAC2D5E31C9D6433009E9C19 /* Build configuration list for PBXNativeTarget "TabletTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - DAC2D5E41C9D6433009E9C19 /* Debug */, - DAC2D5E51C9D6433009E9C19 /* Release */, - ); - defaultConfigurationIsVisible = 0; - }; /* End XCConfigurationList section */ }; rootObject = DAB7EB1F1BEF787300D2AD5E /* Project object */; 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 7f71110bfb3fa8f5bb87dd78354f3cacf835981c..6fe613053bcb6cea09e7d7012eac75a7444f9698 100644 GIT binary patch delta 19299 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 RL#X@9@6-M5{M{7({{hM!`kw#* literal 57640 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 diff --git a/TabletDemo/TabletDemo/ConfigurableTableViewCell.swift b/TabletDemo/TabletDemo/ConfigurableTableViewCell.swift deleted file mode 100644 index 4887c0e..0000000 --- a/TabletDemo/TabletDemo/ConfigurableTableViewCell.swift +++ /dev/null @@ -1,39 +0,0 @@ -// -// ConfigurableTableViewCell.swift -// TabletDemo -// -// Created by Max Sokolov on 08/11/15. -// Copyright © 2015 Tablet. All rights reserved. -// - -import UIKit - -let kConfigurableTableViewCellButtonClickedAction = "button_clicked" - -class ConfigurableTableViewCell: UITableViewCell, ConfigurableCell { - - typealias Item = String - - @IBOutlet weak var button: UIButton! - @IBOutlet weak var contentLabel: UILabel! - - static func reusableIdentifier() -> String { - - return "ConfigurableTableViewCell" - } - - static func estimatedHeight() -> Float { - return 300 - } - - func configureWithItem(item: Item) { - - accessoryType = .DisclosureIndicator - button.setTitle("Button \(item)", forState: .Normal) - } - - @IBAction func buttonClicked(sender: UIButton) { - - Action(key: kConfigurableTableViewCellButtonClickedAction, sender: self).invoke() - } -} \ No newline at end of file diff --git a/TabletDemo/TabletDemo/CustomTableActions.swift b/TabletDemo/TabletDemo/CustomTableActions.swift deleted file mode 100644 index 5466099..0000000 --- a/TabletDemo/TabletDemo/CustomTableActions.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// CustomTableActions.swift -// TabletDemo -// -// Created by Max Sokolov on 14/11/15. -// Copyright © 2015 Tablet. All rights reserved. -// - -import UIKit -import Foundation - -let kTableDirectorDidEndDisplayingCell = "enddisplaycell" - -extension TableDirector { - - public func tableView(tableView: UITableView, didEndDisplayingCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { - - invokeAction(.custom(kTableDirectorDidEndDisplayingCell), cell: cell, indexPath: indexPath) - } -} \ No newline at end of file diff --git a/TabletDemo/TabletDemo/MyNibTableViewCell.swift b/TabletDemo/TabletDemo/MyNibTableViewCell.swift deleted file mode 100644 index 4888fb9..0000000 --- a/TabletDemo/TabletDemo/MyNibTableViewCell.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// MyNibTableViewCell.swift -// TabletDemo -// -// Created by Max Sokolov on 07/12/15. -// Copyright © 2015 Tablet. All rights reserved. -// - -import Foundation -import UIKit - -class MyNibTableViewCell : UITableViewCell { - - -} \ No newline at end of file diff --git a/TabletDemo/TabletDemo/MyNibTableViewCell.xib b/TabletDemo/TabletDemo/MyNibTableViewCell.xib deleted file mode 100644 index 02401db..0000000 --- a/TabletDemo/TabletDemo/MyNibTableViewCell.xib +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/TabletDemo/TabletDemo/MyTableViewCell.swift b/TabletDemo/TabletDemo/MyTableViewCell.swift deleted file mode 100644 index 9f03cea..0000000 --- a/TabletDemo/TabletDemo/MyTableViewCell.swift +++ /dev/null @@ -1,19 +0,0 @@ -// -// MyTableViewCell.swift -// TabletDemo -// -// Created by Max Sokolov on 07/12/15. -// Copyright © 2015 Tablet. All rights reserved. -// - -import Foundation -import UIKit - -class MyTableViewCell : UITableViewCell { - - override func layoutSubviews() { - super.layoutSubviews() - - backgroundColor = UIColor.redColor() - } -} \ No newline at end of file diff --git a/TabletDemo/TabletDemo/ViewController.swift b/TabletDemo/TabletDemo/ViewController.swift deleted file mode 100644 index 388260c..0000000 --- a/TabletDemo/TabletDemo/ViewController.swift +++ /dev/null @@ -1,72 +0,0 @@ -// -// ViewController.swift -// TabletDemo -// -// Created by Max Sokolov on 08/11/15. -// Copyright © 2015 Tablet. All rights reserved. -// - -import UIKit - -class ViewController: UIViewController, UIScrollViewDelegate { - - @IBOutlet weak var tableView: UITableView! { - didSet { - tableDirector = TableDirector(tableView: tableView) - } - } - var tableDirector: TableDirector! - - override func viewDidLoad() { - super.viewDidLoad() - - tableDirector.scrollDelegate = self - - let rowBuilder = TableRowBuilder(items: [1, 2, 3, 4], id: "cell") - .action(.configure) { data in - - data.cell?.textLabel?.text = "\(data.item)" - } - .action(.shouldHighlight) { data in - - return false - } - .action(kTableDirectorDidEndDisplayingCell) { data -> Void in - - print("end display: \(data.indexPath)") - } - - let configurableRowBuilder = TableConfigurableRowBuilder(items: ["5", "6", "7", "8"]) - .action(.click) { data -> Void in - - print("click action indexPath: \(data.indexPath), item: \(data.item)") - } - .action(kConfigurableTableViewCellButtonClickedAction) { data -> Void in - - print("custom action indexPath: \(data.indexPath), item: \(data.item)") - } - .action(.height) { data -> ReturnValue in - - if data.item == "5" { - return 70 - } - return nil - } - .action(.configure) { data -> Void in - - data.cell!.contentLabel.text = "Tablet is a super lightweight yet powerful generic library that handles a complexity of UITableView's datasource and delegate methods in a Swift environment. Tablet's goal is to provide an easiest way to create complex table views. With Tablet you don't have to write a messy code of switch or if statements when you deal with bunch of different cells in different sections." - } - - let myRowBuilder = TableRowBuilder(item: 0, id: "cellll") - - let sectionBuilder = TableSectionBuilder(headerTitle: "Tablet", footerTitle: "Deal with table view like a boss.", rows: [rowBuilder, configurableRowBuilder, myRowBuilder]) - - tableDirector += sectionBuilder - - sectionBuilder.appendRow(TableRowBuilder(item: 0)) - } - - func scrollViewWillBeginDragging(scrollView: UIScrollView) { - print("begin dragging") - } -} \ No newline at end of file From d0486136053563d6d7a2abbd8c850168d9b9483f Mon Sep 17 00:00:00 2001 From: Max Sokolov Date: Sun, 20 Mar 2016 13:06:45 +0300 Subject: [PATCH 17/18] improve internal logic --- .../UserInterfaceState.xcuserstate | Bin 16227 -> 15819 bytes Tablet/TableRowBuilder.swift | 56 +++++++++++------- Tablet/Tablet.swift | 17 +----- .../ViewControllers/MainViewController.swift | 4 ++ 4 files changed, 38 insertions(+), 39 deletions(-) diff --git a/Tablet.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate b/Tablet.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate index 1fef06ba080bf7765c84906d1a4d0237192fb3d4..7edcc6accdff2932934599edf31da711b7bb9439 100644 GIT binary patch delta 9153 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 LYVLKviI4vuJ@vdo delta 9268 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 { } } +public class RowBuilder : NSObject { + + public private(set) var reusableIdentifier: String + public var numberOfRows: Int { + return 0 + } + public var estimatedRowHeight: Float { + return 44 + } + + init(id: String) { + reusableIdentifier = id + } + + // MARK: internal methods, must be overriden in subclass + + func invokeAction(actionType: ActionType, cell: UITableViewCell?, indexPath: NSIndexPath, itemIndex: Int, userInfo: [NSObject: AnyObject]?) -> AnyObject? { + return nil + } + + func registerCell(inTableView tableView: UITableView) { + } +} + /** Responsible for building cells of given type and passing items to them. */ @@ -48,25 +72,18 @@ public class TableRowBuilder : RowBuilder { private var actions = Dictionary>() private var items = [I]() - public var reusableIdentifier: String - public var estimatedRowHeight: Float { - return 44 - } - public var numberOfRows: Int { - get { - return items.count - } + public override var numberOfRows: Int { + return items.count } public init(item: I, id: String? = nil) { - - reusableIdentifier = id ?? NSStringFromClass(C).componentsSeparatedByString(".").last ?? "" + super.init(id: id ?? NSStringFromClass(C).componentsSeparatedByString(".").last ?? "") + items.append(item) } public init(items: [I]? = nil, id: String? = nil) { - - reusableIdentifier = id ?? NSStringFromClass(C).componentsSeparatedByString(".").last ?? "" + super.init(id: id ?? NSStringFromClass(C).componentsSeparatedByString(".").last ?? "") if items != nil { self.items.appendContentsOf(items!) @@ -95,7 +112,7 @@ public class TableRowBuilder : RowBuilder { // MARK: Triggers - public func invokeAction(actionType: ActionType, cell: UITableViewCell?, indexPath: NSIndexPath, itemIndex: Int, userInfo: [NSObject: AnyObject]?) -> AnyObject? { + override func invokeAction(actionType: ActionType, cell: UITableViewCell?, indexPath: NSIndexPath, itemIndex: Int, userInfo: [NSObject: AnyObject]?) -> AnyObject? { if let action = actions[actionType.key] { return action.invoke(ActionData(cell: cell as? C, indexPath: indexPath, item: items[itemIndex], itemIndex: itemIndex, userInfo: userInfo)) @@ -103,7 +120,7 @@ public class TableRowBuilder : RowBuilder { return nil } - public func registerCell(inTableView tableView: UITableView) { + override func registerCell(inTableView tableView: UITableView) { if tableView.dequeueReusableCellWithIdentifier(reusableIdentifier) != nil { return @@ -128,23 +145,20 @@ public class TableRowBuilder : RowBuilder { Responsible for building configurable cells of given type and passing items to them. */ public class TableConfigurableRowBuilder : TableRowBuilder { - + public override var estimatedRowHeight: Float { - return C.estimatedHeight() } public init(item: I) { - super.init(item: item, id: C.reusableIdentifier()) } public init(items: [I]? = nil) { - super.init(items: items, id: C.reusableIdentifier()) } - public override func invokeAction(actionType: ActionType, cell: UITableViewCell?, indexPath: NSIndexPath, itemIndex: Int, userInfo: [NSObject: AnyObject]?) -> AnyObject? { + override func invokeAction(actionType: ActionType, cell: UITableViewCell?, indexPath: NSIndexPath, itemIndex: Int, userInfo: [NSObject: AnyObject]?) -> AnyObject? { switch actionType { case .configure: @@ -160,22 +174,18 @@ public extension TableRowBuilder { // MARK: Items manipulation public func appendItems(items: [I]) { - self.items.appendContentsOf(items) } public func clear() { - items.removeAll() } } public func +=(left: TableRowBuilder, right: I) { - left.appendItems([right]) } public func +=(left: TableRowBuilder, right: [I]) { - left.appendItems(right) } \ No newline at end of file diff --git a/Tablet/Tablet.swift b/Tablet/Tablet.swift index 3a4eaa0..9c344d0 100644 --- a/Tablet/Tablet.swift +++ b/Tablet/Tablet.swift @@ -22,7 +22,7 @@ import UIKit import Foundation struct TabletNotifications { - static let CellAction = "_cellaction" + static let CellAction = "TabletNotificationsCellAction" } /** @@ -113,21 +113,6 @@ public protocol ConfigurableCell { public extension ConfigurableCell where Self: UITableViewCell { static func reusableIdentifier() -> String { - return NSStringFromClass(self).componentsSeparatedByString(".").last ?? "" } -} - -/** - A protocol that every row builder should follow. - A certain section can only works with row builders that respect this protocol. -*/ -public protocol RowBuilder { - - var numberOfRows: Int { get } - var reusableIdentifier: String { get } - var estimatedRowHeight: Float { get } - - func registerCell(inTableView tableView: UITableView) - func invokeAction(actionType: ActionType, cell: UITableViewCell?, indexPath: NSIndexPath, itemIndex: Int, userInfo: [NSObject: AnyObject]?) -> AnyObject? } \ No newline at end of file diff --git a/TabletDemo/Classes/Presentation/Main/ViewControllers/MainViewController.swift b/TabletDemo/Classes/Presentation/Main/ViewControllers/MainViewController.swift index 3831c57..3bb415a 100644 --- a/TabletDemo/Classes/Presentation/Main/ViewControllers/MainViewController.swift +++ b/TabletDemo/Classes/Presentation/Main/ViewControllers/MainViewController.swift @@ -25,5 +25,9 @@ class MainViewController : UITableViewController { data.cell?.accessoryType = .DisclosureIndicator data.cell?.textLabel?.text = "\(data.item)" } + .action(.click) { data -> Void in + + + } } } \ No newline at end of file From 4bcd3a12582a4912aece19f5d2b61593dd41e8ef Mon Sep 17 00:00:00 2001 From: Max Sokolov Date: Sun, 20 Mar 2016 20:57:03 +0300 Subject: [PATCH 18/18] 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) } }