From cb5727e0e914b79e88207403101624aee9377d4f Mon Sep 17 00:00:00 2001 From: Kevin Barnes Date: Fri, 20 Apr 2018 13:14:45 -0400 Subject: [PATCH 1/2] Adds demo project, kills the playgrounds --- .../timeline.xctimeline | 6 - .../timeline.xctimeline | 6 - Example.playground/contents.xcplayground | 7 - FunctionalTableData.xcodeproj/project.pbxproj | 200 +++++++++++++++++- FunctionalTableDataDemo/AppDelegate.swift | 20 ++ .../AppIcon.appiconset/Contents.json | 98 +++++++++ .../Assets.xcassets/Contents.json | 6 + .../collection.imageset/Contents.json | 15 ++ .../collection.imageset/keypad.pdf | Bin 0 -> 61864 bytes .../table.imageset/Contents.json | 15 ++ .../Assets.xcassets/table.imageset/list.pdf | Bin 0 -> 69772 bytes .../Base.lproj/LaunchScreen.storyboard | 25 +++ .../Base.lproj/Main.storyboard | 137 ++++++++++++ .../CollectionExampleController.swift | 22 +- FunctionalTableDataDemo/Info.plist | 55 +++++ .../LabelCell.swift | 0 .../TableExampleController.swift | 21 +- 17 files changed, 587 insertions(+), 46 deletions(-) delete mode 100644 Example.playground/Pages/Collection View.xcplaygroundpage/timeline.xctimeline delete mode 100644 Example.playground/Pages/Table View.xcplaygroundpage/timeline.xctimeline delete mode 100644 Example.playground/contents.xcplayground create mode 100644 FunctionalTableDataDemo/AppDelegate.swift create mode 100644 FunctionalTableDataDemo/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 FunctionalTableDataDemo/Assets.xcassets/Contents.json create mode 100644 FunctionalTableDataDemo/Assets.xcassets/collection.imageset/Contents.json create mode 100644 FunctionalTableDataDemo/Assets.xcassets/collection.imageset/keypad.pdf create mode 100644 FunctionalTableDataDemo/Assets.xcassets/table.imageset/Contents.json create mode 100644 FunctionalTableDataDemo/Assets.xcassets/table.imageset/list.pdf create mode 100644 FunctionalTableDataDemo/Base.lproj/LaunchScreen.storyboard create mode 100644 FunctionalTableDataDemo/Base.lproj/Main.storyboard rename Example.playground/Pages/Collection View.xcplaygroundpage/Contents.swift => FunctionalTableDataDemo/CollectionExampleController.swift (60%) create mode 100644 FunctionalTableDataDemo/Info.plist rename {Example.playground/Sources => FunctionalTableDataDemo}/LabelCell.swift (100%) rename Example.playground/Pages/Table View.xcplaygroundpage/Contents.swift => FunctionalTableDataDemo/TableExampleController.swift (67%) diff --git a/Example.playground/Pages/Collection View.xcplaygroundpage/timeline.xctimeline b/Example.playground/Pages/Collection View.xcplaygroundpage/timeline.xctimeline deleted file mode 100644 index bf468af..0000000 --- a/Example.playground/Pages/Collection View.xcplaygroundpage/timeline.xctimeline +++ /dev/null @@ -1,6 +0,0 @@ - - - - - diff --git a/Example.playground/Pages/Table View.xcplaygroundpage/timeline.xctimeline b/Example.playground/Pages/Table View.xcplaygroundpage/timeline.xctimeline deleted file mode 100644 index bf468af..0000000 --- a/Example.playground/Pages/Table View.xcplaygroundpage/timeline.xctimeline +++ /dev/null @@ -1,6 +0,0 @@ - - - - - diff --git a/Example.playground/contents.xcplayground b/Example.playground/contents.xcplayground deleted file mode 100644 index 08b64fe..0000000 --- a/Example.playground/contents.xcplayground +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/FunctionalTableData.xcodeproj/project.pbxproj b/FunctionalTableData.xcodeproj/project.pbxproj index 3753747..4c59e13 100644 --- a/FunctionalTableData.xcodeproj/project.pbxproj +++ b/FunctionalTableData.xcodeproj/project.pbxproj @@ -7,6 +7,15 @@ objects = { /* Begin PBXBuildFile section */ + 17E57FE9208A404700BFCC3D /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17E57FE8208A404700BFCC3D /* AppDelegate.swift */; }; + 17E57FEB208A404700BFCC3D /* TableExampleController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17E57FEA208A404700BFCC3D /* TableExampleController.swift */; }; + 17E57FED208A404700BFCC3D /* CollectionExampleController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17E57FEC208A404700BFCC3D /* CollectionExampleController.swift */; }; + 17E57FF0208A404700BFCC3D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 17E57FEE208A404700BFCC3D /* Main.storyboard */; }; + 17E57FF2208A404800BFCC3D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 17E57FF1208A404800BFCC3D /* Assets.xcassets */; }; + 17E57FF5208A404800BFCC3D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 17E57FF3208A404800BFCC3D /* LaunchScreen.storyboard */; }; + 17E57FFA208A415900BFCC3D /* FunctionalTableData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C7A26FC1F2FA0F800360E9B /* FunctionalTableData.framework */; }; + 17E57FFB208A415900BFCC3D /* FunctionalTableData.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4C7A26FC1F2FA0F800360E9B /* FunctionalTableData.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 17E58000208A425F00BFCC3D /* LabelCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17E57FFF208A425F00BFCC3D /* LabelCell.swift */; }; 4C63250B1F8AA89B00B2B74B /* TableCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CCCE8441F8AA7CD00C73258 /* TableCell.swift */; }; 4C63250C1F8AA89D00B2B74B /* TableItemConfigType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CCCE8451F8AA7CD00C73258 /* TableItemConfigType.swift */; }; 4C63250D1F8AA8A000B2B74B /* UITableView+Reusable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CCCE8461F8AA7CD00C73258 /* UITableView+Reusable.swift */; }; @@ -37,6 +46,13 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ + 17E57FFC208A415900BFCC3D /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 4C7A26F31F2FA0F800360E9B /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4C7A26FB1F2FA0F800360E9B; + remoteInfo = FunctionalTableData; + }; 4C7A27071F2FA0F800360E9B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 4C7A26F31F2FA0F800360E9B /* Project object */; @@ -46,8 +62,30 @@ }; /* End PBXContainerItemProxy section */ +/* Begin PBXCopyFilesBuildPhase section */ + 17E57FFE208A415900BFCC3D /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 17E57FFB208A415900BFCC3D /* FunctionalTableData.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ - 4C30E4071FA029FE00337415 /* Example.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = Example.playground; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + 17E57FE6208A404700BFCC3D /* FunctionalTableDataDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FunctionalTableDataDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 17E57FE8208A404700BFCC3D /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 17E57FEA208A404700BFCC3D /* TableExampleController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TableExampleController.swift; sourceTree = ""; }; + 17E57FEC208A404700BFCC3D /* CollectionExampleController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CollectionExampleController.swift; sourceTree = ""; }; + 17E57FEF208A404700BFCC3D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 17E57FF1208A404800BFCC3D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 17E57FF4208A404800BFCC3D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 17E57FF6208A404800BFCC3D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 17E57FFF208A425F00BFCC3D /* LabelCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LabelCell.swift; sourceTree = ""; }; 4C7A26FC1F2FA0F800360E9B /* FunctionalTableData.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FunctionalTableData.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 4C7A26FF1F2FA0F800360E9B /* FunctionalTableData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FunctionalTableData.h; sourceTree = ""; }; 4C7A27001F2FA0F800360E9B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -81,6 +119,14 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 17E57FE3208A404700BFCC3D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 17E57FFA208A415900BFCC3D /* FunctionalTableData.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 4C7A26F81F2FA0F800360E9B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -99,12 +145,27 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 17E57FE7208A404700BFCC3D /* FunctionalTableDataDemo */ = { + isa = PBXGroup; + children = ( + 17E57FFF208A425F00BFCC3D /* LabelCell.swift */, + 17E57FE8208A404700BFCC3D /* AppDelegate.swift */, + 17E57FEA208A404700BFCC3D /* TableExampleController.swift */, + 17E57FEC208A404700BFCC3D /* CollectionExampleController.swift */, + 17E57FEE208A404700BFCC3D /* Main.storyboard */, + 17E57FF1208A404800BFCC3D /* Assets.xcassets */, + 17E57FF3208A404800BFCC3D /* LaunchScreen.storyboard */, + 17E57FF6208A404800BFCC3D /* Info.plist */, + ); + path = FunctionalTableDataDemo; + sourceTree = ""; + }; 4C7A26F21F2FA0F800360E9B = { isa = PBXGroup; children = ( - 4C30E4071FA029FE00337415 /* Example.playground */, 4C7A26FE1F2FA0F800360E9B /* FunctionalTableData */, 4C7A27091F2FA0F800360E9B /* FunctionalTableDataTests */, + 17E57FE7208A404700BFCC3D /* FunctionalTableDataDemo */, 4C7A26FD1F2FA0F800360E9B /* Products */, ); sourceTree = ""; @@ -114,6 +175,7 @@ children = ( 4C7A26FC1F2FA0F800360E9B /* FunctionalTableData.framework */, 4C7A27051F2FA0F800360E9B /* FunctionalTableDataTests.xctest */, + 17E57FE6208A404700BFCC3D /* FunctionalTableDataDemo.app */, ); name = Products; sourceTree = ""; @@ -206,6 +268,25 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ + 17E57FE5208A404700BFCC3D /* FunctionalTableDataDemo */ = { + isa = PBXNativeTarget; + buildConfigurationList = 17E57FF9208A404800BFCC3D /* Build configuration list for PBXNativeTarget "FunctionalTableDataDemo" */; + buildPhases = ( + 17E57FE2208A404700BFCC3D /* Sources */, + 17E57FE3208A404700BFCC3D /* Frameworks */, + 17E57FE4208A404700BFCC3D /* Resources */, + 17E57FFE208A415900BFCC3D /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 17E57FFD208A415900BFCC3D /* PBXTargetDependency */, + ); + name = FunctionalTableDataDemo; + productName = FunctionalTableDataDemo; + productReference = 17E57FE6208A404700BFCC3D /* FunctionalTableDataDemo.app */; + productType = "com.apple.product-type.application"; + }; 4C7A26FB1F2FA0F800360E9B /* FunctionalTableData */ = { isa = PBXNativeTarget; buildConfigurationList = 4C7A27101F2FA0F800360E9B /* Build configuration list for PBXNativeTarget "FunctionalTableData" */; @@ -248,12 +329,18 @@ 4C7A26F31F2FA0F800360E9B /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 0830; + LastSwiftUpdateCheck = 0930; LastUpgradeCheck = 0930; ORGANIZATIONNAME = Shopify; TargetAttributes = { + 17E57FE5208A404700BFCC3D = { + CreatedOnToolsVersion = 9.3; + DevelopmentTeam = UD42KN75C7; + ProvisioningStyle = Automatic; + }; 4C7A26FB1F2FA0F800360E9B = { CreatedOnToolsVersion = 8.3.3; + DevelopmentTeam = UD42KN75C7; LastSwiftMigration = 0900; ProvisioningStyle = Automatic; }; @@ -279,11 +366,22 @@ targets = ( 4C7A26FB1F2FA0F800360E9B /* FunctionalTableData */, 4C7A27041F2FA0F800360E9B /* FunctionalTableDataTests */, + 17E57FE5208A404700BFCC3D /* FunctionalTableDataDemo */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 17E57FE4208A404700BFCC3D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 17E57FF5208A404800BFCC3D /* LaunchScreen.storyboard in Resources */, + 17E57FF2208A404800BFCC3D /* Assets.xcassets in Resources */, + 17E57FF0208A404700BFCC3D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 4C7A26FA1F2FA0F800360E9B /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -301,6 +399,17 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 17E57FE2208A404700BFCC3D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 17E57FED208A404700BFCC3D /* CollectionExampleController.swift in Sources */, + 17E57FE9208A404700BFCC3D /* AppDelegate.swift in Sources */, + 17E58000208A425F00BFCC3D /* LabelCell.swift in Sources */, + 17E57FEB208A404700BFCC3D /* TableExampleController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 4C7A26F71F2FA0F800360E9B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -343,6 +452,11 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ + 17E57FFD208A415900BFCC3D /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 4C7A26FB1F2FA0F800360E9B /* FunctionalTableData */; + targetProxy = 17E57FFC208A415900BFCC3D /* PBXContainerItemProxy */; + }; 4C7A27081F2FA0F800360E9B /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 4C7A26FB1F2FA0F800360E9B /* FunctionalTableData */; @@ -350,7 +464,70 @@ }; /* End PBXTargetDependency section */ +/* Begin PBXVariantGroup section */ + 17E57FEE208A404700BFCC3D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 17E57FEF208A404700BFCC3D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 17E57FF3208A404800BFCC3D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 17E57FF4208A404800BFCC3D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + /* Begin XCBuildConfiguration section */ + 17E57FF7208A404800BFCC3D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = UD42KN75C7; + GCC_C_LANGUAGE_STANDARD = gnu11; + INFOPLIST_FILE = FunctionalTableDataDemo/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 11.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.jadedpixel.FunctionalTableDataDemo; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 17E57FF8208A404800BFCC3D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = UD42KN75C7; + GCC_C_LANGUAGE_STANDARD = gnu11; + INFOPLIST_FILE = FunctionalTableDataDemo/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 11.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.jadedpixel.FunctionalTableDataDemo; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; 4C7A270E1F2FA0F800360E9B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -473,9 +650,9 @@ buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ENABLE_MODULES = YES; - CODE_SIGN_IDENTITY = ""; + CODE_SIGN_IDENTITY = "iPhone Developer"; DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = UD42KN75C7; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; @@ -495,9 +672,9 @@ buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ENABLE_MODULES = YES; - CODE_SIGN_IDENTITY = ""; + CODE_SIGN_IDENTITY = "iPhone Developer"; DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = UD42KN75C7; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; @@ -540,6 +717,15 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 17E57FF9208A404800BFCC3D /* Build configuration list for PBXNativeTarget "FunctionalTableDataDemo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 17E57FF7208A404800BFCC3D /* Debug */, + 17E57FF8208A404800BFCC3D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 4C7A26F61F2FA0F800360E9B /* Build configuration list for PBXProject "FunctionalTableData" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/FunctionalTableDataDemo/AppDelegate.swift b/FunctionalTableDataDemo/AppDelegate.swift new file mode 100644 index 0000000..cb596af --- /dev/null +++ b/FunctionalTableDataDemo/AppDelegate.swift @@ -0,0 +1,20 @@ +// +// AppDelegate.swift +// FunctionalTableDataDemo +// +// Created by Kevin Barnes on 2018-04-20. +// Copyright © 2018 Shopify. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + return true + } + +} diff --git a/FunctionalTableDataDemo/Assets.xcassets/AppIcon.appiconset/Contents.json b/FunctionalTableDataDemo/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d8db8d6 --- /dev/null +++ b/FunctionalTableDataDemo/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/FunctionalTableDataDemo/Assets.xcassets/Contents.json b/FunctionalTableDataDemo/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/FunctionalTableDataDemo/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/FunctionalTableDataDemo/Assets.xcassets/collection.imageset/Contents.json b/FunctionalTableDataDemo/Assets.xcassets/collection.imageset/Contents.json new file mode 100644 index 0000000..2a99787 --- /dev/null +++ b/FunctionalTableDataDemo/Assets.xcassets/collection.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "keypad.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/FunctionalTableDataDemo/Assets.xcassets/collection.imageset/keypad.pdf b/FunctionalTableDataDemo/Assets.xcassets/collection.imageset/keypad.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d8731317a324b7622d6f13af46b98a90ac79cf1d GIT binary patch literal 61864 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 Y!p&o(b(CChouas3{^LJ76X}=#4S-(|+5i9m literal 0 HcmV?d00001 diff --git a/FunctionalTableDataDemo/Assets.xcassets/table.imageset/Contents.json b/FunctionalTableDataDemo/Assets.xcassets/table.imageset/Contents.json new file mode 100644 index 0000000..a68667d --- /dev/null +++ b/FunctionalTableDataDemo/Assets.xcassets/table.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "list.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/FunctionalTableDataDemo/Assets.xcassets/table.imageset/list.pdf b/FunctionalTableDataDemo/Assets.xcassets/table.imageset/list.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4c85ee736f94c4171d19b7bac44afc9a96bcc256 GIT binary patch literal 69772 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%0Ap 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 DdQ^BC literal 0 HcmV?d00001 diff --git a/FunctionalTableDataDemo/Base.lproj/LaunchScreen.storyboard b/FunctionalTableDataDemo/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f83f6fd --- /dev/null +++ b/FunctionalTableDataDemo/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/FunctionalTableDataDemo/Base.lproj/Main.storyboard b/FunctionalTableDataDemo/Base.lproj/Main.storyboard new file mode 100644 index 0000000..ac47692 --- /dev/null +++ b/FunctionalTableDataDemo/Base.lproj/Main.storyboard @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example.playground/Pages/Collection View.xcplaygroundpage/Contents.swift b/FunctionalTableDataDemo/CollectionExampleController.swift similarity index 60% rename from Example.playground/Pages/Collection View.xcplaygroundpage/Contents.swift rename to FunctionalTableDataDemo/CollectionExampleController.swift index b915196..5e0288e 100644 --- a/Example.playground/Pages/Collection View.xcplaygroundpage/Contents.swift +++ b/FunctionalTableDataDemo/CollectionExampleController.swift @@ -1,8 +1,15 @@ +// +// SecondViewController.swift +// FunctionalTableDataDemo +// +// Created by Kevin Barnes on 2018-04-20. +// Copyright © 2018 Shopify. All rights reserved. +// + import UIKit -import PlaygroundSupport import FunctionalTableData -class ExampleViewController: UICollectionViewController { +class CollectionExampleController: UICollectionViewController { private let functionalData = FunctionalCollectionData() private var items: [String] = [] { didSet { @@ -15,7 +22,7 @@ class ExampleViewController: UICollectionViewController { collectionView?.backgroundColor = .white functionalData.collectionView = collectionView - title = "Example" + title = "Collection View" navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(didSelectAdd)) } @@ -37,12 +44,3 @@ class ExampleViewController: UICollectionViewController { ]) } } - -// Create a layout, this is the key part when dealing with UICollectionView. -let layout = UICollectionViewFlowLayout() -layout.estimatedItemSize = UICollectionViewFlowLayoutAutomaticSize - -// Present the view controller in the Live View window -let liveController = UINavigationController(rootViewController: ExampleViewController(collectionViewLayout: layout)) -liveController.preferredContentSize = CGSize(width: 320, height: 420) -PlaygroundPage.current.liveView = liveController diff --git a/FunctionalTableDataDemo/Info.plist b/FunctionalTableDataDemo/Info.plist new file mode 100644 index 0000000..6873106 --- /dev/null +++ b/FunctionalTableDataDemo/Info.plist @@ -0,0 +1,55 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UIStatusBarTintParameters + + UINavigationBar + + Style + UIBarStyleDefault + Translucent + + + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Example.playground/Sources/LabelCell.swift b/FunctionalTableDataDemo/LabelCell.swift similarity index 100% rename from Example.playground/Sources/LabelCell.swift rename to FunctionalTableDataDemo/LabelCell.swift diff --git a/Example.playground/Pages/Table View.xcplaygroundpage/Contents.swift b/FunctionalTableDataDemo/TableExampleController.swift similarity index 67% rename from Example.playground/Pages/Table View.xcplaygroundpage/Contents.swift rename to FunctionalTableDataDemo/TableExampleController.swift index cf083ba..26a5001 100644 --- a/Example.playground/Pages/Table View.xcplaygroundpage/Contents.swift +++ b/FunctionalTableDataDemo/TableExampleController.swift @@ -1,8 +1,16 @@ +// +// FirstViewController.swift +// FunctionalTableDataDemo +// +// Created by Kevin Barnes on 2018-04-20. +// Copyright © 2018 Shopify. All rights reserved. +// + import UIKit -import PlaygroundSupport import FunctionalTableData -class ExampleViewController: UITableViewController { +class TableExampleController: UITableViewController { + private let functionalData = FunctionalTableData() private var items: [String] = [] { didSet { @@ -14,7 +22,7 @@ class ExampleViewController: UITableViewController { super.viewDidLoad() functionalData.tableView = tableView - title = "Example" + title = "Table View" navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(didSelectAdd)) } @@ -32,11 +40,8 @@ class ExampleViewController: UITableViewController { functionalData.renderAndDiff([ TableSection(key: "section", rows: rows) - ]) + ]) } + } -// Present the view controller in the Live View window -let liveController = UINavigationController(rootViewController: ExampleViewController()) -liveController.preferredContentSize = CGSize(width: 320, height: 420) -PlaygroundPage.current.liveView = liveController From 2689c00329dde21dbdf5dfb5a4df2bb07bf19de0 Mon Sep 17 00:00:00 2001 From: Kevin Barnes Date: Fri, 20 Apr 2018 13:39:23 -0400 Subject: [PATCH 2/2] Remove references to playgrounds --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ba280fc..4b7e098 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ To use the Functional Table Data (FTD) two things are required, one instance of ## Usage -Check out the [example playground](/Example.playground) for a fully interactive example. +Check out the [demo app](/FunctionalTableDataDemo) for a fully interactive example. Any time you want to update the data currently being displayed you generate the new state and pass it off to your instance of the Functional Table Data. The FTD is then responsible for computing the differences between the previous state and the next state and updating itself as necessary. @@ -74,7 +74,7 @@ functionalTableData.renderAndDiff([section]) -Check out the [example playground](/Example.playground) for a fully interactive example. +Check out the [demo app](/FunctionalTableDataDemo) for a fully interactive example. ### Building new Cells Knowing that a cell consists of a view and state let's start with a simple example, a cell that displays a label. By specifying the generic requirements of `HostCell`, the simplest possible example is one that takes an `UILabel` as its view, a `String` as its state and `LayoutMarginsTableItemLayout` as the layout (See `TableItemLayout` for more info).