From a413b4f87e03eb06ca39b1ca15608052b3d17b2d Mon Sep 17 00:00:00 2001 From: Max Sokolov Date: Sun, 8 Nov 2015 22:27:55 +0300 Subject: [PATCH] provide demo project --- README.md | 8 +- .../TabletDemo.xcodeproj/project.pbxproj | 4 + .../UserInterfaceState.xcuserstate | Bin 12263 -> 21145 bytes TabletDemo/TabletDemo/AppDelegate.swift | 33 +----- .../Base.lproj/LaunchScreen.storyboard | 5 +- .../TabletDemo/Base.lproj/Main.storyboard | 94 +++++++++++++++++- .../ConfigurableTableViewCell.swift | 33 ++++++ TabletDemo/TabletDemo/ViewController.swift | 36 +++++-- 8 files changed, 163 insertions(+), 50 deletions(-) create mode 100644 TabletDemo/TabletDemo/ConfigurableTableViewCell.swift diff --git a/README.md b/README.md index 3e46306..3935676 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,8 @@ director.appendSections(sectionBuilder) ### Cell actions +Tablet provides a chaining approach to handle actions from your cells: + ```swift import Tablet @@ -84,9 +86,9 @@ import Tablet class UserTableViewCell : UITableViewCell { - @IBAction func shareButtonClicked(sender: UIButton) { + @IBAction func buttonClicked(sender: UIButton) { - Action(key: "action_key", sender: self).trigger() + Action(key: "action_key", sender: self, userInfo: nil).trigger() } } ``` @@ -94,7 +96,7 @@ And receive this actions with your row builder: ```swift import Tablet -let rowBuilder = TableRowBuilder(items: users, id: "reusable_id") +let rowBuilder = TableRowBuilder(items: users, id: "reusable_id") .action(.click) { data in } diff --git a/TabletDemo/TabletDemo.xcodeproj/project.pbxproj b/TabletDemo/TabletDemo.xcodeproj/project.pbxproj index 1c74af6..3c3b98c 100644 --- a/TabletDemo/TabletDemo.xcodeproj/project.pbxproj +++ b/TabletDemo/TabletDemo.xcodeproj/project.pbxproj @@ -13,6 +13,7 @@ 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 */; settings = {ASSET_TAGS = (); }; }; + DAB7EB401BEFD07E00D2AD5E /* ConfigurableTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAB7EB3F1BEFD07E00D2AD5E /* ConfigurableTableViewCell.swift */; settings = {ASSET_TAGS = (); }; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -24,6 +25,7 @@ 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 = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -59,6 +61,7 @@ children = ( DAB7EB2A1BEF787300D2AD5E /* AppDelegate.swift */, DAB7EB2C1BEF787300D2AD5E /* ViewController.swift */, + DAB7EB3F1BEFD07E00D2AD5E /* ConfigurableTableViewCell.swift */, DAB7EB2E1BEF787300D2AD5E /* Main.storyboard */, DAB7EB311BEF787300D2AD5E /* Assets.xcassets */, DAB7EB331BEF787300D2AD5E /* LaunchScreen.storyboard */, @@ -148,6 +151,7 @@ files = ( DAB7EB2D1BEF787300D2AD5E /* ViewController.swift in Sources */, DAB7EB3E1BEF78A400D2AD5E /* Tablet.swift in Sources */, + DAB7EB401BEFD07E00D2AD5E /* ConfigurableTableViewCell.swift in Sources */, DAB7EB2B1BEF787300D2AD5E /* AppDelegate.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; 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 77672232c294afb01b19a607b6399e4524971cbc..daf4a1ae6ef4382ff03e0752c1edcbec2e236f3c 100644 GIT binary patch literal 21145 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 delta 7284 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 diff --git a/TabletDemo/TabletDemo/AppDelegate.swift b/TabletDemo/TabletDemo/AppDelegate.swift index 5453072..69cc0e6 100644 --- a/TabletDemo/TabletDemo/AppDelegate.swift +++ b/TabletDemo/TabletDemo/AppDelegate.swift @@ -12,35 +12,4 @@ import UIKit class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? - - - func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { - // Override point for customization after application launch. - return true - } - - func applicationWillResignActive(application: UIApplication) { - // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. - } - - func applicationDidEnterBackground(application: UIApplication) { - // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. - } - - func applicationWillEnterForeground(application: UIApplication) { - // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. - } - - func applicationDidBecomeActive(application: UIApplication) { - // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. - } - - func applicationWillTerminate(application: UIApplication) { - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. - } - - -} - +} \ No newline at end of file diff --git a/TabletDemo/TabletDemo/Base.lproj/LaunchScreen.storyboard b/TabletDemo/TabletDemo/Base.lproj/LaunchScreen.storyboard index 2e721e1..ffacbd6 100644 --- a/TabletDemo/TabletDemo/Base.lproj/LaunchScreen.storyboard +++ b/TabletDemo/TabletDemo/Base.lproj/LaunchScreen.storyboard @@ -1,7 +1,8 @@ - + - + + diff --git a/TabletDemo/TabletDemo/Base.lproj/Main.storyboard b/TabletDemo/TabletDemo/Base.lproj/Main.storyboard index 3a2a49b..98f93de 100644 --- a/TabletDemo/TabletDemo/Base.lproj/Main.storyboard +++ b/TabletDemo/TabletDemo/Base.lproj/Main.storyboard @@ -1,13 +1,14 @@ - + - + + - + @@ -15,11 +16,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TabletDemo/TabletDemo/ConfigurableTableViewCell.swift b/TabletDemo/TabletDemo/ConfigurableTableViewCell.swift new file mode 100644 index 0000000..3d96de5 --- /dev/null +++ b/TabletDemo/TabletDemo/ConfigurableTableViewCell.swift @@ -0,0 +1,33 @@ +// +// 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! + + static func reusableIdentifier() -> String { + + return "configurable_cell" + } + + func configureWithItem(item: Item) { + + button.setTitle("Button \(item)", forState: .Normal) + } + + @IBAction func buttonClicked(sender: UIButton) { + + Action(key: kConfigurableTableViewCellButtonClickedAction, sender: self).trigger() + } +} \ No newline at end of file diff --git a/TabletDemo/TabletDemo/ViewController.swift b/TabletDemo/TabletDemo/ViewController.swift index 327c880..8dd2ca5 100644 --- a/TabletDemo/TabletDemo/ViewController.swift +++ b/TabletDemo/TabletDemo/ViewController.swift @@ -10,16 +10,32 @@ import UIKit class ViewController: UIViewController { + @IBOutlet weak var tableView: UITableView! + var tableDirector: TableDirector! + override func viewDidLoad() { super.viewDidLoad() - // Do any additional setup after loading the view, typically from a nib. + + tableDirector = TableDirector(tableView: tableView) + + let rowBuilder = TableRowBuilder(items: [1, 2, 3, 4], id: "cell") + .action(.configure) { data in + + data.cell.textLabel?.text = "\(data.item)" + } + + let configurableRowBuilder = TableConfigurableRowBuilder(items: ["5", "6", "7", "8"]) + .action(kConfigurableTableViewCellButtonClickedAction) { data in + + print("custom action indexPath: \(data.indexPath), item: \(data.item)") + } + .action(.click) { data in + + print("custom action indexPath: \(data.indexPath), item: \(data.item)") + } + + let sectionBuilder = TableSectionBuilder(headerTitle: "Tablet", footerTitle: "Deal with table view like a boss.", rowBuilders: [rowBuilder, configurableRowBuilder]) + + tableDirector.appendSection(sectionBuilder) } - - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. - } - - -} - +} \ No newline at end of file