From 8613687eeafb2032da8275c084e17d161d52512f Mon Sep 17 00:00:00 2001 From: Max Sokolov Date: Mon, 23 Nov 2015 22:58:14 +0300 Subject: [PATCH 01/11] perform -> invoke --- README.md | 22 +++++++++--------- Tablet/TableDirector.swift | 20 ++++++++-------- Tablet/TableRowBuilder.swift | 6 ++--- Tablet/Tablet.swift | 4 ++-- .../UserInterfaceState.xcuserstate | Bin 25548 -> 25705 bytes .../ConfigurableTableViewCell.swift | 2 +- .../TabletDemo/CustomTableActions.swift | 2 +- 7 files changed, 28 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index d23abe9..6193aaa 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ You may want to setup a very basic table view, without any custom cells. In that import Tablet let rowBuilder = TableRowBuilder(items: [user1, user2, user3], id: "reusable_id") - .action(.configure) { data in + .action(.configure) { data -> Void in data.cell?.textLabel?.text = data.item.username data.cell?.detailTextLabel?.text = data.item.isActive ? "Active" : "Inactive" @@ -104,13 +104,13 @@ Tablet provides a chaining approach to handle actions from your cells: import Tablet let rowBuilder = TableRowBuilder(items: [user1, user2, user3], id: "reusable_id") - .action(.configure) { data in + .action(.configure) { data -> Void in } - .action(.click) { data in + .action(.click) { data -> Void in } - .action(.shouldHighlight) { data in + .action(.shouldHighlight) { data -> ReturnValue in return false } @@ -126,7 +126,7 @@ class MyTableViewCell : UITableViewCell { @IBAction func buttonClicked(sender: UIButton) { - Action(key: kMyAction, sender: self, userInfo: nil).perform() + Action(key: kMyAction, sender: self, userInfo: nil).invoke() } } ``` @@ -135,13 +135,13 @@ And receive this actions with your row builder: import Tablet let rowBuilder = TableConfigurableRowBuilder(items: users, id: "reusable_id", estimatedRowHeight: 42) - .action(.click) { data in + .action(.click) { data -> Void in } - .action(.willDisplay) { data in + .action(.willDisplay) { data -> Void in } - .action(kMyAction) { data in + .action(kMyAction) { data -> Void in } ``` @@ -159,18 +159,18 @@ extension TableDirector { public func tableView(tableView: UITableView, didEndDisplayingCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { - performAction(.custom(kTableDirectorDidEndDisplayingCell), cell: cell, indexPath: indexPath) + invokeAction(.custom(kTableDirectorDidEndDisplayingCell), cell: cell, indexPath: indexPath) } } ``` Catch your action with row builder: ```swift let rowBuilder = TableConfigurableRowBuilder(items: users, estimatedRowHeight: 42) - .action(kTableDirectorDidEndDisplayingCell) { data in + .action(kTableDirectorDidEndDisplayingCell) { data -> Void in } ``` -You could also perform an action that returns a value. +You could also invoke an action that returns a value. ## License diff --git a/Tablet/TableDirector.swift b/Tablet/TableDirector.swift index 30c6daf..41498bb 100644 --- a/Tablet/TableDirector.swift +++ b/Tablet/TableDirector.swift @@ -69,10 +69,10 @@ public class TableDirector: NSObject, UITableViewDataSource, UITableViewDelegate return sections[indexPath.section].builderAtIndex(indexPath.row)! } - public func performAction(action: ActionType, cell: UITableViewCell?, indexPath: NSIndexPath) -> AnyObject? { + public func invokeAction(action: ActionType, cell: UITableViewCell?, indexPath: NSIndexPath) -> AnyObject? { let builder = builderAtIndexPath(indexPath) - return builder.0.performAction(action, cell: cell, indexPath: indexPath, itemIndex: builder.1) + return builder.0.invokeAction(action, cell: cell, indexPath: indexPath, itemIndex: builder.1) } internal func didReceiveAction(notification: NSNotification) { @@ -80,7 +80,7 @@ public class TableDirector: NSObject, UITableViewDataSource, UITableViewDelegate if let action = notification.object as? Action, indexPath = tableView.indexPathForCell(action.cell) { let builder = builderAtIndexPath(indexPath) - builder.0.performAction(.custom(action.key), cell: action.cell, indexPath: indexPath, itemIndex: builder.1) + builder.0.invokeAction(.custom(action.key), cell: action.cell, indexPath: indexPath, itemIndex: builder.1) } } @@ -102,7 +102,7 @@ public class TableDirector: NSObject, UITableViewDataSource, UITableViewDelegate let cell = tableView.dequeueReusableCellWithIdentifier(builder.0.reusableIdentifier, forIndexPath: indexPath) - builder.0.performAction(.configure, cell: cell, indexPath: indexPath, itemIndex: builder.1) + builder.0.invokeAction(.configure, cell: cell, indexPath: indexPath, itemIndex: builder.1) return cell } @@ -156,32 +156,32 @@ extension TableDirector { public func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { - return performAction(.height, cell: nil, indexPath: indexPath) as? CGFloat ?? UITableViewAutomaticDimension + return invokeAction(.height, cell: nil, indexPath: indexPath) as? CGFloat ?? UITableViewAutomaticDimension } public func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { let cell = tableView.cellForRowAtIndexPath(indexPath) - if performAction(.click, cell: cell, indexPath: indexPath) != nil { + if invokeAction(.click, cell: cell, indexPath: indexPath) != nil { tableView.deselectRowAtIndexPath(indexPath, animated: true) } else { - performAction(.select, cell: cell, indexPath: indexPath) + invokeAction(.select, cell: cell, indexPath: indexPath) } } public func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) { - performAction(.deselect, cell: tableView.cellForRowAtIndexPath(indexPath), indexPath: indexPath) + invokeAction(.deselect, cell: tableView.cellForRowAtIndexPath(indexPath), indexPath: indexPath) } public func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { - performAction(.willDisplay, cell: cell, indexPath: indexPath) + invokeAction(.willDisplay, cell: cell, indexPath: indexPath) } public func tableView(tableView: UITableView, shouldHighlightRowAtIndexPath indexPath: NSIndexPath) -> Bool { - return performAction(.shouldHighlight, cell: tableView.cellForRowAtIndexPath(indexPath), indexPath: indexPath) as? Bool ?? true + return invokeAction(.shouldHighlight, cell: tableView.cellForRowAtIndexPath(indexPath), indexPath: indexPath) as? Bool ?? true } } \ No newline at end of file diff --git a/Tablet/TableRowBuilder.swift b/Tablet/TableRowBuilder.swift index edd2854..016fa2a 100644 --- a/Tablet/TableRowBuilder.swift +++ b/Tablet/TableRowBuilder.swift @@ -107,7 +107,7 @@ public class TableRowBuilder : RowBuilder { // MARK: Triggers - public func performAction(actionType: ActionType, cell: UITableViewCell?, indexPath: NSIndexPath, itemIndex: Int) -> AnyObject? { + public func invokeAction(actionType: ActionType, cell: UITableViewCell?, indexPath: NSIndexPath, itemIndex: Int) -> AnyObject? { if let action = actions[actionType.key] { return action.call(ActionData(cell: cell as? C, indexPath: indexPath, item: items[itemIndex], itemIndex: itemIndex)) @@ -129,13 +129,13 @@ public class TableConfigurableRowBuilder AnyObject? { + public override func invokeAction(actionType: ActionType, cell: UITableViewCell?, indexPath: NSIndexPath, itemIndex: Int) -> AnyObject? { switch actionType { case .configure: (cell as? C)?.configureWithItem(items[itemIndex]) default: break } - return super.performAction(actionType, cell: cell, indexPath: indexPath, itemIndex: itemIndex) + return super.invokeAction(actionType, cell: cell, indexPath: indexPath, itemIndex: itemIndex) } } diff --git a/Tablet/Tablet.swift b/Tablet/Tablet.swift index 3331c53..698cd50 100644 --- a/Tablet/Tablet.swift +++ b/Tablet/Tablet.swift @@ -86,7 +86,7 @@ public class Action { self.userInfo = userInfo } - public func perform() { + public func invoke() { NSNotificationCenter.defaultCenter().postNotificationName(kActionPerformedNotificationKey, object: self) } @@ -114,5 +114,5 @@ public protocol RowBuilder { var reusableIdentifier: String { get } var estimatedRowHeight: CGFloat { get } - func performAction(actionType: ActionType, cell: UITableViewCell?, indexPath: NSIndexPath, itemIndex: Int) -> AnyObject? + func invokeAction(actionType: ActionType, cell: UITableViewCell?, indexPath: NSIndexPath, itemIndex: Int) -> AnyObject? } \ No newline at end of file diff --git a/TabletDemo/TabletDemo.xcodeproj/project.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate b/TabletDemo/TabletDemo.xcodeproj/project.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate index 37a26d591729787b08719fcdb0e923493a543e62..479978b8f6b32052174734cf863c4d01bbf8411d 100644 GIT binary patch delta 12280 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

Jjyr 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 diff --git a/TabletDemo/TabletDemo/ConfigurableTableViewCell.swift b/TabletDemo/TabletDemo/ConfigurableTableViewCell.swift index 07be0a2..215a443 100644 --- a/TabletDemo/TabletDemo/ConfigurableTableViewCell.swift +++ b/TabletDemo/TabletDemo/ConfigurableTableViewCell.swift @@ -29,6 +29,6 @@ class ConfigurableTableViewCell: UITableViewCell, ConfigurableCell { @IBAction func buttonClicked(sender: UIButton) { - Action(key: kConfigurableTableViewCellButtonClickedAction, sender: self).perform() + Action(key: kConfigurableTableViewCellButtonClickedAction, sender: self).invoke() } } \ No newline at end of file diff --git a/TabletDemo/TabletDemo/CustomTableActions.swift b/TabletDemo/TabletDemo/CustomTableActions.swift index c586a75..5466099 100644 --- a/TabletDemo/TabletDemo/CustomTableActions.swift +++ b/TabletDemo/TabletDemo/CustomTableActions.swift @@ -15,6 +15,6 @@ extension TableDirector { public func tableView(tableView: UITableView, didEndDisplayingCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { - performAction(.custom(kTableDirectorDidEndDisplayingCell), cell: cell, indexPath: indexPath) + invokeAction(.custom(kTableDirectorDidEndDisplayingCell), cell: cell, indexPath: indexPath) } } \ No newline at end of file From e14317ba5602f6a3d7aba21627377a1e972fa9d5 Mon Sep 17 00:00:00 2001 From: Max Sokolov Date: Wed, 25 Nov 2015 21:48:57 +0300 Subject: [PATCH 02/11] += operator overloading --- Tablet/TableDirector.swift | 10 ++++++++++ Tablet/TableRowBuilder.swift | 4 ++-- .../UserInterfaceState.xcuserstate | Bin 25705 -> 25883 bytes TabletDemo/TabletDemo/ViewController.swift | 2 +- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/Tablet/TableDirector.swift b/Tablet/TableDirector.swift index 41498bb..1b1cea1 100644 --- a/Tablet/TableDirector.swift +++ b/Tablet/TableDirector.swift @@ -184,4 +184,14 @@ extension TableDirector { return invokeAction(.shouldHighlight, cell: tableView.cellForRowAtIndexPath(indexPath), indexPath: indexPath) as? Bool ?? true } +} + +public func +=(left: TableDirector, right: RowBuilder) { + + left.appendSection(TableSectionBuilder(rowBuilders: [right])) +} + +public func +=(left: TableDirector, right: TableSectionBuilder) { + + left.appendSection(right) } \ No newline at end of file diff --git a/Tablet/TableRowBuilder.swift b/Tablet/TableRowBuilder.swift index 016fa2a..0ac2389 100644 --- a/Tablet/TableRowBuilder.swift +++ b/Tablet/TableRowBuilder.swift @@ -28,7 +28,7 @@ internal enum ActionHandler { case actionBlock((data: ActionData) -> Void) case actionReturnBlock((data: ActionData) -> AnyObject?) - func call(data: ActionData) -> AnyObject? { + func invoke(data: ActionData) -> AnyObject? { switch (self) { case .actionBlock(let closure): @@ -110,7 +110,7 @@ public class TableRowBuilder : RowBuilder { public func invokeAction(actionType: ActionType, cell: UITableViewCell?, indexPath: NSIndexPath, itemIndex: Int) -> AnyObject? { if let action = actions[actionType.key] { - return action.call(ActionData(cell: cell as? C, indexPath: indexPath, item: items[itemIndex], itemIndex: itemIndex)) + return action.invoke(ActionData(cell: cell as? C, indexPath: indexPath, item: items[itemIndex], itemIndex: itemIndex)) } return nil } 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 479978b8f6b32052174734cf863c4d01bbf8411d..fe73904c54da62879bf88243451797d9012e509f 100644 GIT binary patch delta 12821 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 CR&jLz diff --git a/TabletDemo/TabletDemo/ViewController.swift b/TabletDemo/TabletDemo/ViewController.swift index ed353d5..af228c3 100644 --- a/TabletDemo/TabletDemo/ViewController.swift +++ b/TabletDemo/TabletDemo/ViewController.swift @@ -55,6 +55,6 @@ class ViewController: UIViewController { let sectionBuilder = TableSectionBuilder(headerTitle: "Tablet", footerTitle: "Deal with table view like a boss.", rowBuilders: [rowBuilder, configurableRowBuilder]) - tableDirector.appendSection(sectionBuilder) + tableDirector += sectionBuilder } } \ No newline at end of file From fa0a02bea9101b8b2e86c6368b99c125447ec084 Mon Sep 17 00:00:00 2001 From: Max Sokolov Date: Thu, 26 Nov 2015 20:36:12 +0300 Subject: [PATCH 03/11] improvements --- Tablet/TableDirector.swift | 76 +++++++++++------- Tablet/TableRowBuilder.swift | 29 ++++--- Tablet/TableSectionBuilder.swift | 14 +++- .../UserInterfaceState.xcuserstate | Bin 12583 -> 13343 bytes 4 files changed, 74 insertions(+), 45 deletions(-) diff --git a/Tablet/TableDirector.swift b/Tablet/TableDirector.swift index 1b1cea1..daacd4c 100644 --- a/Tablet/TableDirector.swift +++ b/Tablet/TableDirector.swift @@ -44,16 +44,6 @@ public class TableDirector: NSObject, UITableViewDataSource, UITableViewDelegate NSNotificationCenter.defaultCenter().removeObserver(self) } - // MARK: Sections manipulation - - public func appendSection(section: TableSectionBuilder) { - sections.append(section) - } - - public func appendSections(sections: [TableSectionBuilder]) { - self.sections.appendContentsOf(sections) - } - // MARK: Private methods /** @@ -83,84 +73,100 @@ public class TableDirector: NSObject, UITableViewDataSource, UITableViewDelegate builder.0.invokeAction(.custom(action.key), cell: action.cell, indexPath: indexPath, itemIndex: builder.1) } } +} + +extension TableDirector { + // MARK: Sections manipulation + + public func appendSection(section: TableSectionBuilder) { + sections.append(section) + } + + public func appendSections(sections: [TableSectionBuilder]) { + self.sections.appendContentsOf(sections) + } +} + +public extension TableDirector { + // MARK: UITableViewDataSource - configuration - public func numberOfSectionsInTableView(tableView: UITableView) -> Int { + func numberOfSectionsInTableView(tableView: UITableView) -> Int { return sections.count } - public func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return sections[section].numberOfRowsInSection } - public func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let builder = builderAtIndexPath(indexPath) let cell = tableView.dequeueReusableCellWithIdentifier(builder.0.reusableIdentifier, forIndexPath: indexPath) builder.0.invokeAction(.configure, cell: cell, indexPath: indexPath, itemIndex: builder.1) - + return cell } } -extension TableDirector { +public extension TableDirector { // MARK: UITableViewDataSource - section setup - public func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { + func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { return sections[section].headerTitle } - public func tableView(tableView: UITableView, titleForFooterInSection section: Int) -> String? { + func tableView(tableView: UITableView, titleForFooterInSection section: Int) -> String? { return sections[section].footerTitle } // MARK: UITableViewDelegate - section setup - public func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { + func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { return sections[section].headerView } - public func tableView(tableView: UITableView, viewForFooterInSection section: Int) -> UIView? { + func tableView(tableView: UITableView, viewForFooterInSection section: Int) -> UIView? { return sections[section].footerView } - public func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { + func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return sections[section].headerHeight } - public func tableView(tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { + func tableView(tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { return sections[section].footerHeight } } -extension TableDirector { +public extension TableDirector { // MARK: UITableViewDelegate - actions - public func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { + func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return builderAtIndexPath(indexPath).0.estimatedRowHeight } - public func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { + func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return invokeAction(.height, cell: nil, indexPath: indexPath) as? CGFloat ?? UITableViewAutomaticDimension } - public func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { - + func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { + let cell = tableView.cellForRowAtIndexPath(indexPath) if invokeAction(.click, cell: cell, indexPath: indexPath) != nil { @@ -170,17 +176,17 @@ extension TableDirector { } } - public func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) { - + func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) { + invokeAction(.deselect, cell: tableView.cellForRowAtIndexPath(indexPath), indexPath: indexPath) } - public func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { + func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { invokeAction(.willDisplay, cell: cell, indexPath: indexPath) } - public func tableView(tableView: UITableView, shouldHighlightRowAtIndexPath indexPath: NSIndexPath) -> Bool { + func tableView(tableView: UITableView, shouldHighlightRowAtIndexPath indexPath: NSIndexPath) -> Bool { return invokeAction(.shouldHighlight, cell: tableView.cellForRowAtIndexPath(indexPath), indexPath: indexPath) as? Bool ?? true } @@ -191,7 +197,17 @@ public func +=(left: TableDirector, right: RowBuilder) { left.appendSection(TableSectionBuilder(rowBuilders: [right])) } +public func +=(left: TableDirector, right: [RowBuilder]) { + + left.appendSection(TableSectionBuilder(rowBuilders: 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 0ac2389..390e668 100644 --- a/Tablet/TableRowBuilder.swift +++ b/Tablet/TableRowBuilder.swift @@ -72,18 +72,6 @@ public class TableRowBuilder : RowBuilder { self.items.appendContentsOf(items!) } } - - // MARK: Items manipulation - - public func appendItems(items: [I]) { - - self.items.appendContentsOf(items) - } - - public func clear() { - - items.removeAll() - } // MARK: Chaining actions @@ -119,7 +107,7 @@ public class TableRowBuilder : RowBuilder { /** Responsible for building configurable cells of given type and passing items to them. */ -public class TableConfigurableRowBuilder : TableRowBuilder { +public class TableConfigurableRowBuilder : TableRowBuilder { public init(item: I, estimatedRowHeight: CGFloat = UITableViewAutomaticDimension) { super.init(item: item, id: C.reusableIdentifier(), estimatedRowHeight: estimatedRowHeight) @@ -139,3 +127,18 @@ public class TableConfigurableRowBuilder2&vAw)LQ#!YAdqX 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 delta 6757 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 Date: Fri, 27 Nov 2015 16:50:44 +0300 Subject: [PATCH 04/11] default reusableIdentifier implementation --- Tablet/Tablet.swift | 8 +++++++ .../UserInterfaceState.xcuserstate | Bin 13343 -> 15706 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 5 ++++ .../TabletDemo/Base.lproj/Main.storyboard | 22 +++++++++--------- .../ConfigurableTableViewCell.swift | 2 +- 5 files changed, 25 insertions(+), 12 deletions(-) create mode 100644 TabletDemo/TabletDemo.xcodeproj/xcuserdata/max.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist diff --git a/Tablet/Tablet.swift b/Tablet/Tablet.swift index 698cd50..074016b 100644 --- a/Tablet/Tablet.swift +++ b/Tablet/Tablet.swift @@ -104,6 +104,14 @@ public protocol ConfigurableCell { func configureWithItem(item: Item) } +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. diff --git a/TabletDemo/TabletDemo.xcodeproj/project.xcworkspace/xcuserdata/max.xcuserdatad/UserInterfaceState.xcuserstate b/TabletDemo/TabletDemo.xcodeproj/project.xcworkspace/xcuserdata/max.xcuserdatad/UserInterfaceState.xcuserstate index eb6cc0e442473748bf0ad79f7413a37240b8e3ff..78ba641525658cbc88a9ae61c2f6d756a0dfda16 100644 GIT binary patch literal 15706 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 ZQCU%4QGHS4NCZTrzx3OX00MW7fA2O~fUC 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 t{`>t8`XBZ`7GMqt2?z}c4~Pnw5wJX$!HNI? diff --git a/TabletDemo/TabletDemo.xcodeproj/xcuserdata/max.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/TabletDemo/TabletDemo.xcodeproj/xcuserdata/max.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..fe2b454 --- /dev/null +++ b/TabletDemo/TabletDemo.xcodeproj/xcuserdata/max.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,5 @@ + + + diff --git a/TabletDemo/TabletDemo/Base.lproj/Main.storyboard b/TabletDemo/TabletDemo/Base.lproj/Main.storyboard index 2bd0123..7c1d36f 100644 --- a/TabletDemo/TabletDemo/Base.lproj/Main.storyboard +++ b/TabletDemo/TabletDemo/Base.lproj/Main.storyboard @@ -1,8 +1,8 @@ - + - + @@ -20,21 +20,21 @@ - + - + - + @@ -42,11 +42,11 @@ - - + + - +