From 9d0f658752f865531e849eb971b3ef3a548a1f23 Mon Sep 17 00:00:00 2001 From: Audrey Welch Date: Thu, 6 Dec 2018 15:17:08 -0600 Subject: [PATCH 1/4] Comprehension Questions completed and added to file --- .DS_Store | Bin 0 -> 6148 bytes .../project.pbxproj | 373 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../UserInterfaceState.xcuserstate | Bin 0 -> 6870 bytes .../UserInterfaceState.xcuserstate | Bin 0 -> 30199 bytes .../xcschemes/xcschememanagement.plist | 14 + .../xcschemes/xcschememanagement.plist | 14 + Detail/AppDelegate.swift | 10 + .../AppIcon.appiconset/Contents.json | 98 +++++ Detail/Assets.xcassets/Contents.json | 6 + Detail/Base.lproj/LaunchScreen.storyboard | 25 ++ Detail/Base.lproj/Main.storyboard | 236 +++++++++++ Detail/DetailViewController.swift | 24 ++ Detail/EntryCell.swift | 18 + Detail/EntryCell.xib | 88 +++++ Detail/Info.plist | 45 +++ Detail/Model.swift | 22 ++ Detail/ModelUpdateClient.swift | 5 + Detail/Person.swift | 10 + Detail/PersonCell.swift | 8 + Detail/PersonCell.xib | 53 +++ Detail/TableViewController.swift | 64 +++ POST and PUT Comprehension Questions.rtf | 65 +++ 24 files changed, 1193 insertions(+) create mode 100644 .DS_Store create mode 100644 Detail copy for wk 4.xcodeproj/project.pbxproj create mode 100644 Detail copy for wk 4.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Detail copy for wk 4.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Detail copy for wk 4.xcodeproj/project.xcworkspace/xcuserdata/audreywelch.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 Detail copy for wk 4.xcodeproj/project.xcworkspace/xcuserdata/ericasadun.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 Detail copy for wk 4.xcodeproj/xcuserdata/audreywelch.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 Detail copy for wk 4.xcodeproj/xcuserdata/ericasadun.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 Detail/AppDelegate.swift create mode 100644 Detail/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Detail/Assets.xcassets/Contents.json create mode 100644 Detail/Base.lproj/LaunchScreen.storyboard create mode 100644 Detail/Base.lproj/Main.storyboard create mode 100644 Detail/DetailViewController.swift create mode 100644 Detail/EntryCell.swift create mode 100644 Detail/EntryCell.xib create mode 100644 Detail/Info.plist create mode 100644 Detail/Model.swift create mode 100644 Detail/ModelUpdateClient.swift create mode 100644 Detail/Person.swift create mode 100644 Detail/PersonCell.swift create mode 100644 Detail/PersonCell.xib create mode 100644 Detail/TableViewController.swift create mode 100644 POST and PUT Comprehension Questions.rtf diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..ab017ae41badbdf2f84ade0d185ed8f450b365f2 GIT binary patch literal 6148 zcmeHK%Wl&^6upy%;sgN^LTXpY8zdG{lu*J3A(=dovOok}U;(JLYo{?dcCZ~x2|?NL z5%33m3SYqIz?nx;9;8czV6HUxjPGkaXXF_V5wX_9YY%$yIoTv_ImvVW)OWI>tNQzK z9RBJ%?$f}}4=PvNag;ehCI@O*^4cosxnoVVghMdShd^h7+j@%|$*51)pp z8{y3Y*doL{q6sW1#*>y5Va{bO{M3g;4GfiRg0 zl&MTzF_^kJFqsa&rQ+ujWjZl2GU}+2nYy7cb@5=P2q$Jq)LJv38CYh3|5idO{QU23 zzW<9LtuzCgfq#<$R_xfF7UrhT*0ovkv(`jAMB~Ea<`P8;lsb+@habheXhPsKc?W1I UoJ)iSqJIPg4O(di{wM=K0kFf#+W-In literal 0 HcmV?d00001 diff --git a/Detail copy for wk 4.xcodeproj/project.pbxproj b/Detail copy for wk 4.xcodeproj/project.pbxproj new file mode 100644 index 0000000..9f6bf51 --- /dev/null +++ b/Detail copy for wk 4.xcodeproj/project.pbxproj @@ -0,0 +1,373 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 8E4DE798219C9EB200AFE381 /* Model.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E4DE797219C9EB200AFE381 /* Model.swift */; }; + 8E4DE79A219C9F3800AFE381 /* Person.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E4DE799219C9F3800AFE381 /* Person.swift */; }; + 8E4DE79C219CA16500AFE381 /* TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E4DE79B219CA16500AFE381 /* TableViewController.swift */; }; + 8E4DE79E219CAA7700AFE381 /* ModelUpdateClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E4DE79D219CAA7700AFE381 /* ModelUpdateClient.swift */; }; + 8E9AA977219C92880012896B /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E9AA976219C92880012896B /* AppDelegate.swift */; }; + 8E9AA97C219C92880012896B /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8E9AA97A219C92880012896B /* Main.storyboard */; }; + 8E9AA97E219C928B0012896B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8E9AA97D219C928B0012896B /* Assets.xcassets */; }; + 8E9AA981219C928B0012896B /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8E9AA97F219C928B0012896B /* LaunchScreen.storyboard */; }; + 8E9AA989219C92CB0012896B /* PersonCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E9AA988219C92CB0012896B /* PersonCell.swift */; }; + 8E9AA98B219C92D50012896B /* EntryCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E9AA98A219C92D50012896B /* EntryCell.swift */; }; + 8E9AA98D219C93100012896B /* PersonCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8E9AA98C219C93100012896B /* PersonCell.xib */; }; + 8E9AA98F219C93170012896B /* EntryCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8E9AA98E219C93170012896B /* EntryCell.xib */; }; + 8E9AA991219C9BDD0012896B /* DetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E9AA990219C9BDD0012896B /* DetailViewController.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 8E4DE797219C9EB200AFE381 /* Model.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Model.swift; sourceTree = ""; }; + 8E4DE799219C9F3800AFE381 /* Person.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Person.swift; sourceTree = ""; }; + 8E4DE79B219CA16500AFE381 /* TableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TableViewController.swift; sourceTree = ""; }; + 8E4DE79D219CAA7700AFE381 /* ModelUpdateClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModelUpdateClient.swift; sourceTree = ""; }; + 8E9AA973219C92880012896B /* Detail.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Detail.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 8E9AA976219C92880012896B /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 8E9AA97B219C92880012896B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 8E9AA97D219C928B0012896B /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 8E9AA980219C928B0012896B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 8E9AA982219C928B0012896B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 8E9AA988219C92CB0012896B /* PersonCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PersonCell.swift; sourceTree = ""; }; + 8E9AA98A219C92D50012896B /* EntryCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EntryCell.swift; sourceTree = ""; }; + 8E9AA98C219C93100012896B /* PersonCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PersonCell.xib; sourceTree = ""; }; + 8E9AA98E219C93170012896B /* EntryCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = EntryCell.xib; sourceTree = ""; }; + 8E9AA990219C9BDD0012896B /* DetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailViewController.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8E9AA970219C92880012896B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 8E9AA96A219C92880012896B = { + isa = PBXGroup; + children = ( + 8E9AA975219C92880012896B /* Detail */, + 8E9AA974219C92880012896B /* Products */, + ); + sourceTree = ""; + }; + 8E9AA974219C92880012896B /* Products */ = { + isa = PBXGroup; + children = ( + 8E9AA973219C92880012896B /* Detail.app */, + ); + name = Products; + sourceTree = ""; + }; + 8E9AA975219C92880012896B /* Detail */ = { + isa = PBXGroup; + children = ( + 8E9AA976219C92880012896B /* AppDelegate.swift */, + 8E9AA988219C92CB0012896B /* PersonCell.swift */, + 8E9AA98C219C93100012896B /* PersonCell.xib */, + 8E9AA98A219C92D50012896B /* EntryCell.swift */, + 8E9AA98E219C93170012896B /* EntryCell.xib */, + 8E9AA990219C9BDD0012896B /* DetailViewController.swift */, + 8E4DE79B219CA16500AFE381 /* TableViewController.swift */, + 8E4DE797219C9EB200AFE381 /* Model.swift */, + 8E4DE79D219CAA7700AFE381 /* ModelUpdateClient.swift */, + 8E4DE799219C9F3800AFE381 /* Person.swift */, + 8E9AA97A219C92880012896B /* Main.storyboard */, + 8E9AA97D219C928B0012896B /* Assets.xcassets */, + 8E9AA97F219C928B0012896B /* LaunchScreen.storyboard */, + 8E9AA982219C928B0012896B /* Info.plist */, + ); + path = Detail; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 8E9AA972219C92880012896B /* Detail */ = { + isa = PBXNativeTarget; + buildConfigurationList = 8E9AA985219C928B0012896B /* Build configuration list for PBXNativeTarget "Detail" */; + buildPhases = ( + 8E9AA96F219C92880012896B /* Sources */, + 8E9AA970219C92880012896B /* Frameworks */, + 8E9AA971219C92880012896B /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Detail; + productName = Detail; + productReference = 8E9AA973219C92880012896B /* Detail.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 8E9AA96B219C92880012896B /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1010; + LastUpgradeCheck = 1010; + ORGANIZATIONNAME = "Erica Sadun"; + TargetAttributes = { + 8E9AA972219C92880012896B = { + CreatedOnToolsVersion = 10.1; + }; + }; + }; + buildConfigurationList = 8E9AA96E219C92880012896B /* Build configuration list for PBXProject "Detail" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 8E9AA96A219C92880012896B; + productRefGroup = 8E9AA974219C92880012896B /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8E9AA972219C92880012896B /* Detail */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 8E9AA971219C92880012896B /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8E9AA981219C928B0012896B /* LaunchScreen.storyboard in Resources */, + 8E9AA97E219C928B0012896B /* Assets.xcassets in Resources */, + 8E9AA98F219C93170012896B /* EntryCell.xib in Resources */, + 8E9AA98D219C93100012896B /* PersonCell.xib in Resources */, + 8E9AA97C219C92880012896B /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 8E9AA96F219C92880012896B /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8E4DE79A219C9F3800AFE381 /* Person.swift in Sources */, + 8E4DE79C219CA16500AFE381 /* TableViewController.swift in Sources */, + 8E4DE798219C9EB200AFE381 /* Model.swift in Sources */, + 8E9AA989219C92CB0012896B /* PersonCell.swift in Sources */, + 8E9AA98B219C92D50012896B /* EntryCell.swift in Sources */, + 8E4DE79E219CAA7700AFE381 /* ModelUpdateClient.swift in Sources */, + 8E9AA977219C92880012896B /* AppDelegate.swift in Sources */, + 8E9AA991219C9BDD0012896B /* DetailViewController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 8E9AA97A219C92880012896B /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 8E9AA97B219C92880012896B /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 8E9AA97F219C928B0012896B /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 8E9AA980219C928B0012896B /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 8E9AA983219C928B0012896B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + 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 = 12.1; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 8E9AA984219C928B0012896B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + 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 = 12.1; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 8E9AA986219C928B0012896B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 2W4DVPEQ39; + INFOPLIST_FILE = Detail/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.sadun.Detail; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 8E9AA987219C928B0012896B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 2W4DVPEQ39; + INFOPLIST_FILE = Detail/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.sadun.Detail; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 8E9AA96E219C92880012896B /* Build configuration list for PBXProject "Detail" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 8E9AA983219C928B0012896B /* Debug */, + 8E9AA984219C928B0012896B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 8E9AA985219C928B0012896B /* Build configuration list for PBXNativeTarget "Detail" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 8E9AA986219C928B0012896B /* Debug */, + 8E9AA987219C928B0012896B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 8E9AA96B219C92880012896B /* Project object */; +} diff --git a/Detail copy for wk 4.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Detail copy for wk 4.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..50d85f8 --- /dev/null +++ b/Detail copy for wk 4.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Detail copy for wk 4.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Detail copy for wk 4.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Detail copy for wk 4.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Detail copy for wk 4.xcodeproj/project.xcworkspace/xcuserdata/audreywelch.xcuserdatad/UserInterfaceState.xcuserstate b/Detail copy for wk 4.xcodeproj/project.xcworkspace/xcuserdata/audreywelch.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..6ad3eab178c646a11ec646f07a96770dff4beddd GIT binary patch literal 6870 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 RZ4xld;4@QwCjQ%2{XfNk7_9&R literal 0 HcmV?d00001 diff --git a/Detail copy for wk 4.xcodeproj/project.xcworkspace/xcuserdata/ericasadun.xcuserdatad/UserInterfaceState.xcuserstate b/Detail copy for wk 4.xcodeproj/project.xcworkspace/xcuserdata/ericasadun.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..1dcbe099f19b4fcae4ff1fcbd08413c121af0cd2 GIT binary patch literal 30199 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 KxACXu`2PWz7QUAN literal 0 HcmV?d00001 diff --git a/Detail copy for wk 4.xcodeproj/xcuserdata/audreywelch.xcuserdatad/xcschemes/xcschememanagement.plist b/Detail copy for wk 4.xcodeproj/xcuserdata/audreywelch.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..37d3e97 --- /dev/null +++ b/Detail copy for wk 4.xcodeproj/xcuserdata/audreywelch.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + Detail.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/Detail copy for wk 4.xcodeproj/xcuserdata/ericasadun.xcuserdatad/xcschemes/xcschememanagement.plist b/Detail copy for wk 4.xcodeproj/xcuserdata/ericasadun.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..37d3e97 --- /dev/null +++ b/Detail copy for wk 4.xcodeproj/xcuserdata/ericasadun.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + Detail.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/Detail/AppDelegate.swift b/Detail/AppDelegate.swift new file mode 100644 index 0000000..31619e2 --- /dev/null +++ b/Detail/AppDelegate.swift @@ -0,0 +1,10 @@ +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + var window: UIWindow? + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + return true + } +} diff --git a/Detail/Assets.xcassets/AppIcon.appiconset/Contents.json b/Detail/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d8db8d6 --- /dev/null +++ b/Detail/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/Detail/Assets.xcassets/Contents.json b/Detail/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/Detail/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Detail/Base.lproj/LaunchScreen.storyboard b/Detail/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..bfa3612 --- /dev/null +++ b/Detail/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Detail/Base.lproj/Main.storyboard b/Detail/Base.lproj/Main.storyboard new file mode 100644 index 0000000..efdd8b3 --- /dev/null +++ b/Detail/Base.lproj/Main.storyboard @@ -0,0 +1,236 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Detail/DetailViewController.swift b/Detail/DetailViewController.swift new file mode 100644 index 0000000..996820f --- /dev/null +++ b/Detail/DetailViewController.swift @@ -0,0 +1,24 @@ +import UIKit + +class DetailViewController: UIViewController { + var person: Person? + + @IBOutlet weak var nameField: UITextField! + @IBOutlet weak var cohortField: UITextField! + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + + guard let person = person else { return } + nameField.text = person.name + cohortField.text = person.cohort + } + + @IBAction func save(_ sender: Any) { + guard let person = person else { return } + guard let name = nameField.text, !name.isEmpty else { return } + person.name = name + person.cohort = cohortField.text ?? "" + navigationController?.popViewController(animated: true) + } +} diff --git a/Detail/EntryCell.swift b/Detail/EntryCell.swift new file mode 100644 index 0000000..f8b8d39 --- /dev/null +++ b/Detail/EntryCell.swift @@ -0,0 +1,18 @@ +import UIKit + +class EntryCell: UITableViewCell { + static let reuseIdentifier = "entry cell" + + @IBOutlet weak var nameField: UITextField! + + @IBOutlet weak var cohortField: UITextField! + + @IBAction func add(_ sender: Any) { + guard let name = nameField.text, !name.isEmpty else { return } + let cohort = cohortField.text ?? "" + let person = Person(name: name, cohort: cohort) + Model.shared.add(person: person) + nameField.text = nil + cohortField.text = nil + } +} diff --git a/Detail/EntryCell.xib b/Detail/EntryCell.xib new file mode 100644 index 0000000..52c04e8 --- /dev/null +++ b/Detail/EntryCell.xib @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Detail/Info.plist b/Detail/Info.plist new file mode 100644 index 0000000..16be3b6 --- /dev/null +++ b/Detail/Info.plist @@ -0,0 +1,45 @@ + + + + + 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 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Detail/Model.swift b/Detail/Model.swift new file mode 100644 index 0000000..55fb185 --- /dev/null +++ b/Detail/Model.swift @@ -0,0 +1,22 @@ +import Foundation + +class Model { + static let shared = Model() + private init() {} + var delegate: ModelUpdateClient? + + private var persons: [Person] = [] + + func count() -> Int { + return persons.count + } + + func person(forIndex index: Int) -> Person { + return persons[index] + } + + func add(person: Person) { + persons.append(person) + delegate?.modelDidUpdate() + } +} diff --git a/Detail/ModelUpdateClient.swift b/Detail/ModelUpdateClient.swift new file mode 100644 index 0000000..6268cd4 --- /dev/null +++ b/Detail/ModelUpdateClient.swift @@ -0,0 +1,5 @@ +import Foundation + +protocol ModelUpdateClient { + func modelDidUpdate() +} diff --git a/Detail/Person.swift b/Detail/Person.swift new file mode 100644 index 0000000..ccf0dfc --- /dev/null +++ b/Detail/Person.swift @@ -0,0 +1,10 @@ +import Foundation + +class Person { + var name: String + var cohort: String + + init(name: String, cohort: String) { + (self.name, self.cohort) = (name, cohort) + } +} diff --git a/Detail/PersonCell.swift b/Detail/PersonCell.swift new file mode 100644 index 0000000..57762b0 --- /dev/null +++ b/Detail/PersonCell.swift @@ -0,0 +1,8 @@ +import UIKit + +class PersonCell: UITableViewCell { + static let reuseIdentifier = "person cell" + + @IBOutlet weak var nameLabel: UILabel! + @IBOutlet weak var cohortLabel: UILabel! +} diff --git a/Detail/PersonCell.xib b/Detail/PersonCell.xib new file mode 100644 index 0000000..c536c7c --- /dev/null +++ b/Detail/PersonCell.xib @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Detail/TableViewController.swift b/Detail/TableViewController.swift new file mode 100644 index 0000000..84a2ab5 --- /dev/null +++ b/Detail/TableViewController.swift @@ -0,0 +1,64 @@ +import UIKit + +class TableViewController: UITableViewController, ModelUpdateClient { + override func numberOfSections(in tableView: UITableView) -> Int { + return 2 + } + + override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + switch section { + case 0: + return 1 + case 1: + return Model.shared.count() + default: + fatalError("Illegal section") + } + } + + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + if indexPath.section == 0 { + // handle the single entry cell + // return it + guard let cell = tableView.dequeueReusableCell(withIdentifier: EntryCell.reuseIdentifier, for: indexPath) as? EntryCell + else { fatalError("Unable to dequeue entry cell") } + + cell.nameField.text = "" // Coder paranoia + cell.cohortField.text = "" + + return cell + } + + // do anything related to person cell + guard let cell = tableView.dequeueReusableCell(withIdentifier: PersonCell.reuseIdentifier, for: indexPath) as? PersonCell + else { fatalError("Unable to dequeue person cell") } + + let person = Model.shared.person(forIndex: indexPath.row) + cell.nameLabel.text = person.name + cell.cohortLabel.text = person.cohort + return cell + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + tableView.reloadData() + } + + override func viewDidLoad() { + super.viewDidLoad() + Model.shared.delegate = self + } + + func modelDidUpdate() { + tableView.reloadData() + } + + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + guard let indexPath = tableView.indexPathForSelectedRow + else { return } + guard let destination = segue.destination as? DetailViewController + else { return } + + destination.person = Model.shared.person(forIndex: indexPath.row) + } +} diff --git a/POST and PUT Comprehension Questions.rtf b/POST and PUT Comprehension Questions.rtf new file mode 100644 index 0000000..01e9011 --- /dev/null +++ b/POST and PUT Comprehension Questions.rtf @@ -0,0 +1,65 @@ +{\rtf1\ansi\ansicpg1252\cocoartf1561\cocoasubrtf600 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +{\*\expandedcolortbl;;} +\margl1440\margr1440\vieww10800\viewh8400\viewkind0 +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 + +\f0\b\fs28 \cf0 POST and PUT Comprehension Questions +\fs24 \ +[ Week 4 ]\ +\ +What is a RESTful interface? When do you use it? What are its characteristics?\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\qr\partightenfactor0 + +\b0 \cf0 >> A RESTful interface is an architectural style that provides standards or guidelines between computer systems on the web. It allows for communication between the API and the device. REST uses HTTP requests to do different things with data on databases stored on a remote web service. The four resource methods of REST line up with CRUD methods - which are POST, GET, PUT, and DELETE. You use a RESTful interface anytime you want to retrieve, modify, or store resources on a remote web service. One characteristic of a RESTful interface, or a system that is compliant with RESTs guidelines, is that it keeps the user interface separate from the data storage. Another characteristic is that components can be managed or updated without affecting the system as a whole - this is called \'93statelessness.\'94 +\b \ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 +\cf0 \ +What is the difference between POST and PUT?\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\qr\partightenfactor0 + +\b0 \cf0 >> POST and PUT are both ways of giving data to an API. However, PUT is idempotent and POST is not. It doesn\'92t matter how many times you send the data, the API will place the info exactly where you told it to. So if you have already created the data, if you send the data again, it will update the existing resources. If you send the data multiple times using POST, the API will create a unique identifier and add it onto your base URL each time, putting the information at a newly created, unique URL for each time you POST the data. +\b \ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 +\cf0 \ +How does the record ID work in Firebase? Why does it take two steps to save a record (first POST then PUT) app? Why does the FirebaseItem protocol even exist?\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\qr\partightenfactor0 + +\b0 \cf0 >> When you post to the main database, it will return a new record identifier, which allows you to have a URL that is specific to your method. It takes multiple steps to save a record because the first time we POST in order to get a record ID. This is the first time we receive a record ID. Then we add the record ID to our device and save it again (PUT), which then firebase will have the record ID with the data stored. The FirebaseItem protocol is needed so that we have a record ID field. +\b \ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 +\cf0 \ +Explain what a generic type is and what advantages it offers.\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\qr\partightenfactor0 + +\b0 \cf0 >> A generic type is a feature in Swift that allows you to use any type - you don\'92t have to write code that is specific to one type, as long as the behavior is followed of what you conform your type variable to. We call the generic type with . +\b \ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 +\cf0 \ +What does a URLRequest do? When do you need one and when can you just use a URL?\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\qr\partightenfactor0 + +\b0 \cf0 >> URLRequest objects are the thing that we send to an API. Inside the request is our URL, telling the API where we want to access data, and the HTTP Method that we want to use at that URL. You can use just the URL without a URLRequest when you are doing one of the \'93reading\'94 actions - GET. If you are passing a method and a body, like a PUT/POST/DELETE, then you need to create a URL Request instance. +\b \ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 +\cf0 \ +What is the role of a URL session? How does it work?\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\qr\partightenfactor0 + +\b0 \cf0 >> The role of a URLSession is to create the data task that will actually perform the request. It\'92s a very large class that does many things relating to interacting with network resources. After you encode, you create a data task that will perform the request by creating a dataTask constant and setting it to URLSession.shared.dataTask(with: request) and then a completion closure. +\b \ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 +\cf0 \ +What are completion handlers? Why use completion handlers? What advantages do they provide?\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\qr\partightenfactor0 + +\b0 \cf0 >> Completion handlers take the place of delegation or notification because they allow you to send things that need to happen after a task is done. When something is running asynchronously, we can give it something to do as soon as it has finished its first task. A completion handler is the same concept as using protocols and delegates, but it\'92s much better because nothing is stored in multiple places - it stores no information other than the stuff that\'92s going to run once something is complete. +\b \ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 +\cf0 \ +Explain at least three strategies that promote code reuse that we used in today\'92s project.\ + +\b0 >> The firebase.swift file was completely reusable because nothing in our code was specific to the project. Using a model that stores Core Database Management Methods, like the add, count, delete, and update functions are reusable and nice to keep in our Model for this reason. And keeping things in separate files and organized also promotes code reuse by sectioning off tasks. +\b \ +} \ No newline at end of file From db0cfd7535f99f6a61b66f9e5900205ea5d32438 Mon Sep 17 00:00:00 2001 From: Audrey Welch Date: Thu, 6 Dec 2018 15:30:01 -0600 Subject: [PATCH 2/4] Removed Erica's copy of 'Detail' project and added my own copy from Week 3 --- .DS_Store | Bin 6148 -> 6148 bytes .../UserInterfaceState.xcuserstate | Bin 6870 -> 0 bytes .../UserInterfaceState.xcuserstate | Bin 30199 -> 0 bytes .../xcschemes/xcschememanagement.plist | 14 -- Detail/DetailViewController.swift | 24 -- Detail/EntryCell.swift | 18 -- Detail/EntryCell.xib | 88 -------- Detail/Model.swift | 22 -- Detail/ModelUpdateClient.swift | 5 - Detail/Person.swift | 10 - Detail/PersonCell.swift | 8 - Detail/PersonCell.xib | 53 ----- Detail/TableViewController.swift | 64 ------ .../Table Project.xcodeproj}/project.pbxproj | 188 ++++++++-------- .../contents.xcworkspacedata | 2 +- .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../UserInterfaceState.xcuserstate | Bin 0 -> 41196 bytes .../xcschemes/xcschememanagement.plist | 2 +- .../Table Project/AddPersonCell.swift | 14 ++ .../Table Project}/AppDelegate.swift | 6 + .../AppIcon.appiconset/Contents.json | 0 .../Assets.xcassets/Contents.json | 0 .../Base.lproj/LaunchScreen.storyboard | 0 .../Table Project}/Base.lproj/Main.storyboard | 208 +++++++++--------- .../Table Project/DetailViewController.swift | 45 ++++ .../Table Project}/Info.plist | 0 .../Table Project/Model.swift | 57 +++++ .../Table Project/Person.swift | 15 ++ .../Table Project/PersonCell.swift | 10 + .../PersonTableViewController.swift | 100 +++++++++ 30 files changed, 442 insertions(+), 511 deletions(-) delete mode 100644 Detail copy for wk 4.xcodeproj/project.xcworkspace/xcuserdata/audreywelch.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 Detail copy for wk 4.xcodeproj/project.xcworkspace/xcuserdata/ericasadun.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 Detail copy for wk 4.xcodeproj/xcuserdata/ericasadun.xcuserdatad/xcschemes/xcschememanagement.plist delete mode 100644 Detail/DetailViewController.swift delete mode 100644 Detail/EntryCell.swift delete mode 100644 Detail/EntryCell.xib delete mode 100644 Detail/Model.swift delete mode 100644 Detail/ModelUpdateClient.swift delete mode 100644 Detail/Person.swift delete mode 100644 Detail/PersonCell.swift delete mode 100644 Detail/PersonCell.xib delete mode 100644 Detail/TableViewController.swift rename {Detail copy for wk 4.xcodeproj => Table Project - Student & Cohort copy/Table Project.xcodeproj}/project.pbxproj (54%) rename {Detail copy for wk 4.xcodeproj => Table Project - Student & Cohort copy/Table Project.xcodeproj}/project.xcworkspace/contents.xcworkspacedata (68%) rename {Detail copy for wk 4.xcodeproj => Table Project - Student & Cohort copy/Table Project.xcodeproj}/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) create mode 100644 Table Project - Student & Cohort copy/Table Project.xcodeproj/project.xcworkspace/xcuserdata/audreywelch.xcuserdatad/UserInterfaceState.xcuserstate rename {Detail copy for wk 4.xcodeproj => Table Project - Student & Cohort copy/Table Project.xcodeproj}/xcuserdata/audreywelch.xcuserdatad/xcschemes/xcschememanagement.plist (86%) create mode 100644 Table Project - Student & Cohort copy/Table Project/AddPersonCell.swift rename {Detail => Table Project - Student & Cohort copy/Table Project}/AppDelegate.swift (97%) rename {Detail => Table Project - Student & Cohort copy/Table Project}/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename {Detail => Table Project - Student & Cohort copy/Table Project}/Assets.xcassets/Contents.json (100%) rename {Detail => Table Project - Student & Cohort copy/Table Project}/Base.lproj/LaunchScreen.storyboard (100%) rename {Detail => Table Project - Student & Cohort copy/Table Project}/Base.lproj/Main.storyboard (61%) create mode 100644 Table Project - Student & Cohort copy/Table Project/DetailViewController.swift rename {Detail => Table Project - Student & Cohort copy/Table Project}/Info.plist (100%) create mode 100644 Table Project - Student & Cohort copy/Table Project/Model.swift create mode 100644 Table Project - Student & Cohort copy/Table Project/Person.swift create mode 100644 Table Project - Student & Cohort copy/Table Project/PersonCell.swift create mode 100644 Table Project - Student & Cohort copy/Table Project/PersonTableViewController.swift diff --git a/.DS_Store b/.DS_Store index ab017ae41badbdf2f84ade0d185ed8f450b365f2..1836d741a01cc978915afc572e459fc1bc1cfce3 100644 GIT binary patch delta 356 zcmZoMXfc@J&&aVcU^g=($7CKB?a2pN?{Y9OFgO75n#oJqZ0l7SLKqSmk{EIrQW+E& z0vL)I@)@##>|}-#AYT`VgMqA4h7_P!9#~8bDCP`Ql>x*>V3A}XtAL@>GbcYeDJMS( zXtn?Y1LJ2Pt??fWfGh?EtTs83XH`;paRJn-Q$<6E>fB6BBE>0T& delta 305 zcmZoMXfc@J&&atkU^g=(=VTrhZC5r17lu@Z5{5*EOoklKoc!dZoctsP1_l8J2BtzF z?fD-JfGh?E6tzj^#RX8cCnrm>HPlN~R~sAXD43d>)#@lz8yc9J>L?f+8PwKta)_%M z+IlABR#sKl)Yi=eo5jG$2%#DHp)`z|1!SPuR2E#6my@5D4ipFJkwbPdg91Y`Lq0dHO&ya=YMP{IZu9J0GUT{GC`Tzf98CKhk NWvYyu**X650{|&)NDKe~ diff --git a/Detail copy for wk 4.xcodeproj/project.xcworkspace/xcuserdata/audreywelch.xcuserdatad/UserInterfaceState.xcuserstate b/Detail copy for wk 4.xcodeproj/project.xcworkspace/xcuserdata/audreywelch.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 6ad3eab178c646a11ec646f07a96770dff4beddd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6870 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 RZ4xld;4@QwCjQ%2{XfNk7_9&R diff --git a/Detail copy for wk 4.xcodeproj/project.xcworkspace/xcuserdata/ericasadun.xcuserdatad/UserInterfaceState.xcuserstate b/Detail copy for wk 4.xcodeproj/project.xcworkspace/xcuserdata/ericasadun.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 1dcbe099f19b4fcae4ff1fcbd08413c121af0cd2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30199 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 KxACXu`2PWz7QUAN diff --git a/Detail copy for wk 4.xcodeproj/xcuserdata/ericasadun.xcuserdatad/xcschemes/xcschememanagement.plist b/Detail copy for wk 4.xcodeproj/xcuserdata/ericasadun.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 37d3e97..0000000 --- a/Detail copy for wk 4.xcodeproj/xcuserdata/ericasadun.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,14 +0,0 @@ - - - - - SchemeUserState - - Detail.xcscheme_^#shared#^_ - - orderHint - 0 - - - - diff --git a/Detail/DetailViewController.swift b/Detail/DetailViewController.swift deleted file mode 100644 index 996820f..0000000 --- a/Detail/DetailViewController.swift +++ /dev/null @@ -1,24 +0,0 @@ -import UIKit - -class DetailViewController: UIViewController { - var person: Person? - - @IBOutlet weak var nameField: UITextField! - @IBOutlet weak var cohortField: UITextField! - - override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(animated) - - guard let person = person else { return } - nameField.text = person.name - cohortField.text = person.cohort - } - - @IBAction func save(_ sender: Any) { - guard let person = person else { return } - guard let name = nameField.text, !name.isEmpty else { return } - person.name = name - person.cohort = cohortField.text ?? "" - navigationController?.popViewController(animated: true) - } -} diff --git a/Detail/EntryCell.swift b/Detail/EntryCell.swift deleted file mode 100644 index f8b8d39..0000000 --- a/Detail/EntryCell.swift +++ /dev/null @@ -1,18 +0,0 @@ -import UIKit - -class EntryCell: UITableViewCell { - static let reuseIdentifier = "entry cell" - - @IBOutlet weak var nameField: UITextField! - - @IBOutlet weak var cohortField: UITextField! - - @IBAction func add(_ sender: Any) { - guard let name = nameField.text, !name.isEmpty else { return } - let cohort = cohortField.text ?? "" - let person = Person(name: name, cohort: cohort) - Model.shared.add(person: person) - nameField.text = nil - cohortField.text = nil - } -} diff --git a/Detail/EntryCell.xib b/Detail/EntryCell.xib deleted file mode 100644 index 52c04e8..0000000 --- a/Detail/EntryCell.xib +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Detail/Model.swift b/Detail/Model.swift deleted file mode 100644 index 55fb185..0000000 --- a/Detail/Model.swift +++ /dev/null @@ -1,22 +0,0 @@ -import Foundation - -class Model { - static let shared = Model() - private init() {} - var delegate: ModelUpdateClient? - - private var persons: [Person] = [] - - func count() -> Int { - return persons.count - } - - func person(forIndex index: Int) -> Person { - return persons[index] - } - - func add(person: Person) { - persons.append(person) - delegate?.modelDidUpdate() - } -} diff --git a/Detail/ModelUpdateClient.swift b/Detail/ModelUpdateClient.swift deleted file mode 100644 index 6268cd4..0000000 --- a/Detail/ModelUpdateClient.swift +++ /dev/null @@ -1,5 +0,0 @@ -import Foundation - -protocol ModelUpdateClient { - func modelDidUpdate() -} diff --git a/Detail/Person.swift b/Detail/Person.swift deleted file mode 100644 index ccf0dfc..0000000 --- a/Detail/Person.swift +++ /dev/null @@ -1,10 +0,0 @@ -import Foundation - -class Person { - var name: String - var cohort: String - - init(name: String, cohort: String) { - (self.name, self.cohort) = (name, cohort) - } -} diff --git a/Detail/PersonCell.swift b/Detail/PersonCell.swift deleted file mode 100644 index 57762b0..0000000 --- a/Detail/PersonCell.swift +++ /dev/null @@ -1,8 +0,0 @@ -import UIKit - -class PersonCell: UITableViewCell { - static let reuseIdentifier = "person cell" - - @IBOutlet weak var nameLabel: UILabel! - @IBOutlet weak var cohortLabel: UILabel! -} diff --git a/Detail/PersonCell.xib b/Detail/PersonCell.xib deleted file mode 100644 index c536c7c..0000000 --- a/Detail/PersonCell.xib +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Detail/TableViewController.swift b/Detail/TableViewController.swift deleted file mode 100644 index 84a2ab5..0000000 --- a/Detail/TableViewController.swift +++ /dev/null @@ -1,64 +0,0 @@ -import UIKit - -class TableViewController: UITableViewController, ModelUpdateClient { - override func numberOfSections(in tableView: UITableView) -> Int { - return 2 - } - - override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - switch section { - case 0: - return 1 - case 1: - return Model.shared.count() - default: - fatalError("Illegal section") - } - } - - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - if indexPath.section == 0 { - // handle the single entry cell - // return it - guard let cell = tableView.dequeueReusableCell(withIdentifier: EntryCell.reuseIdentifier, for: indexPath) as? EntryCell - else { fatalError("Unable to dequeue entry cell") } - - cell.nameField.text = "" // Coder paranoia - cell.cohortField.text = "" - - return cell - } - - // do anything related to person cell - guard let cell = tableView.dequeueReusableCell(withIdentifier: PersonCell.reuseIdentifier, for: indexPath) as? PersonCell - else { fatalError("Unable to dequeue person cell") } - - let person = Model.shared.person(forIndex: indexPath.row) - cell.nameLabel.text = person.name - cell.cohortLabel.text = person.cohort - return cell - } - - override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(animated) - tableView.reloadData() - } - - override func viewDidLoad() { - super.viewDidLoad() - Model.shared.delegate = self - } - - func modelDidUpdate() { - tableView.reloadData() - } - - override func prepare(for segue: UIStoryboardSegue, sender: Any?) { - guard let indexPath = tableView.indexPathForSelectedRow - else { return } - guard let destination = segue.destination as? DetailViewController - else { return } - - destination.person = Model.shared.person(forIndex: indexPath.row) - } -} diff --git a/Detail copy for wk 4.xcodeproj/project.pbxproj b/Table Project - Student & Cohort copy/Table Project.xcodeproj/project.pbxproj similarity index 54% rename from Detail copy for wk 4.xcodeproj/project.pbxproj rename to Table Project - Student & Cohort copy/Table Project.xcodeproj/project.pbxproj index 9f6bf51..849b81c 100644 --- a/Detail copy for wk 4.xcodeproj/project.pbxproj +++ b/Table Project - Student & Cohort copy/Table Project.xcodeproj/project.pbxproj @@ -7,41 +7,35 @@ objects = { /* Begin PBXBuildFile section */ - 8E4DE798219C9EB200AFE381 /* Model.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E4DE797219C9EB200AFE381 /* Model.swift */; }; - 8E4DE79A219C9F3800AFE381 /* Person.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E4DE799219C9F3800AFE381 /* Person.swift */; }; - 8E4DE79C219CA16500AFE381 /* TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E4DE79B219CA16500AFE381 /* TableViewController.swift */; }; - 8E4DE79E219CAA7700AFE381 /* ModelUpdateClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E4DE79D219CAA7700AFE381 /* ModelUpdateClient.swift */; }; - 8E9AA977219C92880012896B /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E9AA976219C92880012896B /* AppDelegate.swift */; }; - 8E9AA97C219C92880012896B /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8E9AA97A219C92880012896B /* Main.storyboard */; }; - 8E9AA97E219C928B0012896B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8E9AA97D219C928B0012896B /* Assets.xcassets */; }; - 8E9AA981219C928B0012896B /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8E9AA97F219C928B0012896B /* LaunchScreen.storyboard */; }; - 8E9AA989219C92CB0012896B /* PersonCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E9AA988219C92CB0012896B /* PersonCell.swift */; }; - 8E9AA98B219C92D50012896B /* EntryCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E9AA98A219C92D50012896B /* EntryCell.swift */; }; - 8E9AA98D219C93100012896B /* PersonCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8E9AA98C219C93100012896B /* PersonCell.xib */; }; - 8E9AA98F219C93170012896B /* EntryCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8E9AA98E219C93170012896B /* EntryCell.xib */; }; - 8E9AA991219C9BDD0012896B /* DetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E9AA990219C9BDD0012896B /* DetailViewController.swift */; }; + 8464AC7821ADBB8500E85E34 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8464AC7721ADBB8500E85E34 /* AppDelegate.swift */; }; + 8464AC7D21ADBB8500E85E34 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8464AC7B21ADBB8500E85E34 /* Main.storyboard */; }; + 8464AC7F21ADBB8700E85E34 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8464AC7E21ADBB8700E85E34 /* Assets.xcassets */; }; + 8464AC8221ADBB8700E85E34 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8464AC8021ADBB8700E85E34 /* LaunchScreen.storyboard */; }; + 8464AC8A21ADC1BC00E85E34 /* AddPersonCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8464AC8921ADC1BC00E85E34 /* AddPersonCell.swift */; }; + 8464AC8C21ADC1D800E85E34 /* PersonCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8464AC8B21ADC1D800E85E34 /* PersonCell.swift */; }; + 8464AC8E21ADC20E00E85E34 /* DetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8464AC8D21ADC20E00E85E34 /* DetailViewController.swift */; }; + 8464AC9021ADC23300E85E34 /* PersonTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8464AC8F21ADC23300E85E34 /* PersonTableViewController.swift */; }; + 8464AC9221ADC26200E85E34 /* Model.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8464AC9121ADC26200E85E34 /* Model.swift */; }; + 8464AC9421ADC27300E85E34 /* Person.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8464AC9321ADC27300E85E34 /* Person.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - 8E4DE797219C9EB200AFE381 /* Model.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Model.swift; sourceTree = ""; }; - 8E4DE799219C9F3800AFE381 /* Person.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Person.swift; sourceTree = ""; }; - 8E4DE79B219CA16500AFE381 /* TableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TableViewController.swift; sourceTree = ""; }; - 8E4DE79D219CAA7700AFE381 /* ModelUpdateClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModelUpdateClient.swift; sourceTree = ""; }; - 8E9AA973219C92880012896B /* Detail.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Detail.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 8E9AA976219C92880012896B /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 8E9AA97B219C92880012896B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 8E9AA97D219C928B0012896B /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 8E9AA980219C928B0012896B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 8E9AA982219C928B0012896B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 8E9AA988219C92CB0012896B /* PersonCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PersonCell.swift; sourceTree = ""; }; - 8E9AA98A219C92D50012896B /* EntryCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EntryCell.swift; sourceTree = ""; }; - 8E9AA98C219C93100012896B /* PersonCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PersonCell.xib; sourceTree = ""; }; - 8E9AA98E219C93170012896B /* EntryCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = EntryCell.xib; sourceTree = ""; }; - 8E9AA990219C9BDD0012896B /* DetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailViewController.swift; sourceTree = ""; }; + 8464AC7421ADBB8500E85E34 /* Table Project.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Table Project.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 8464AC7721ADBB8500E85E34 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 8464AC7C21ADBB8500E85E34 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 8464AC7E21ADBB8700E85E34 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 8464AC8121ADBB8700E85E34 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 8464AC8321ADBB8700E85E34 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 8464AC8921ADC1BC00E85E34 /* AddPersonCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddPersonCell.swift; sourceTree = ""; }; + 8464AC8B21ADC1D800E85E34 /* PersonCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PersonCell.swift; sourceTree = ""; }; + 8464AC8D21ADC20E00E85E34 /* DetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailViewController.swift; sourceTree = ""; }; + 8464AC8F21ADC23300E85E34 /* PersonTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PersonTableViewController.swift; sourceTree = ""; }; + 8464AC9121ADC26200E85E34 /* Model.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Model.swift; sourceTree = ""; }; + 8464AC9321ADC27300E85E34 /* Person.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Person.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 8E9AA970219C92880012896B /* Frameworks */ = { + 8464AC7121ADBB8500E85E34 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( @@ -51,79 +45,76 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 8E9AA96A219C92880012896B = { + 8464AC6B21ADBB8500E85E34 = { isa = PBXGroup; children = ( - 8E9AA975219C92880012896B /* Detail */, - 8E9AA974219C92880012896B /* Products */, + 8464AC7621ADBB8500E85E34 /* Table Project */, + 8464AC7521ADBB8500E85E34 /* Products */, ); sourceTree = ""; }; - 8E9AA974219C92880012896B /* Products */ = { + 8464AC7521ADBB8500E85E34 /* Products */ = { isa = PBXGroup; children = ( - 8E9AA973219C92880012896B /* Detail.app */, + 8464AC7421ADBB8500E85E34 /* Table Project.app */, ); name = Products; sourceTree = ""; }; - 8E9AA975219C92880012896B /* Detail */ = { + 8464AC7621ADBB8500E85E34 /* Table Project */ = { isa = PBXGroup; children = ( - 8E9AA976219C92880012896B /* AppDelegate.swift */, - 8E9AA988219C92CB0012896B /* PersonCell.swift */, - 8E9AA98C219C93100012896B /* PersonCell.xib */, - 8E9AA98A219C92D50012896B /* EntryCell.swift */, - 8E9AA98E219C93170012896B /* EntryCell.xib */, - 8E9AA990219C9BDD0012896B /* DetailViewController.swift */, - 8E4DE79B219CA16500AFE381 /* TableViewController.swift */, - 8E4DE797219C9EB200AFE381 /* Model.swift */, - 8E4DE79D219CAA7700AFE381 /* ModelUpdateClient.swift */, - 8E4DE799219C9F3800AFE381 /* Person.swift */, - 8E9AA97A219C92880012896B /* Main.storyboard */, - 8E9AA97D219C928B0012896B /* Assets.xcassets */, - 8E9AA97F219C928B0012896B /* LaunchScreen.storyboard */, - 8E9AA982219C928B0012896B /* Info.plist */, + 8464AC7721ADBB8500E85E34 /* AppDelegate.swift */, + 8464AC7B21ADBB8500E85E34 /* Main.storyboard */, + 8464AC9121ADC26200E85E34 /* Model.swift */, + 8464AC9321ADC27300E85E34 /* Person.swift */, + 8464AC8B21ADC1D800E85E34 /* PersonCell.swift */, + 8464AC8921ADC1BC00E85E34 /* AddPersonCell.swift */, + 8464AC8D21ADC20E00E85E34 /* DetailViewController.swift */, + 8464AC8F21ADC23300E85E34 /* PersonTableViewController.swift */, + 8464AC7E21ADBB8700E85E34 /* Assets.xcassets */, + 8464AC8021ADBB8700E85E34 /* LaunchScreen.storyboard */, + 8464AC8321ADBB8700E85E34 /* Info.plist */, ); - path = Detail; + path = "Table Project"; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 8E9AA972219C92880012896B /* Detail */ = { + 8464AC7321ADBB8500E85E34 /* Table Project */ = { isa = PBXNativeTarget; - buildConfigurationList = 8E9AA985219C928B0012896B /* Build configuration list for PBXNativeTarget "Detail" */; + buildConfigurationList = 8464AC8621ADBB8700E85E34 /* Build configuration list for PBXNativeTarget "Table Project" */; buildPhases = ( - 8E9AA96F219C92880012896B /* Sources */, - 8E9AA970219C92880012896B /* Frameworks */, - 8E9AA971219C92880012896B /* Resources */, + 8464AC7021ADBB8500E85E34 /* Sources */, + 8464AC7121ADBB8500E85E34 /* Frameworks */, + 8464AC7221ADBB8500E85E34 /* Resources */, ); buildRules = ( ); dependencies = ( ); - name = Detail; - productName = Detail; - productReference = 8E9AA973219C92880012896B /* Detail.app */; + name = "Table Project"; + productName = "Table Project"; + productReference = 8464AC7421ADBB8500E85E34 /* Table Project.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ - 8E9AA96B219C92880012896B /* Project object */ = { + 8464AC6C21ADBB8500E85E34 /* Project object */ = { isa = PBXProject; attributes = { LastSwiftUpdateCheck = 1010; LastUpgradeCheck = 1010; - ORGANIZATIONNAME = "Erica Sadun"; + ORGANIZATIONNAME = "Audrey Welch"; TargetAttributes = { - 8E9AA972219C92880012896B = { + 8464AC7321ADBB8500E85E34 = { CreatedOnToolsVersion = 10.1; }; }; }; - buildConfigurationList = 8E9AA96E219C92880012896B /* Build configuration list for PBXProject "Detail" */; + buildConfigurationList = 8464AC6F21ADBB8500E85E34 /* Build configuration list for PBXProject "Table Project" */; compatibilityVersion = "Xcode 9.3"; developmentRegion = en; hasScannedForEncodings = 0; @@ -131,62 +122,59 @@ en, Base, ); - mainGroup = 8E9AA96A219C92880012896B; - productRefGroup = 8E9AA974219C92880012896B /* Products */; + mainGroup = 8464AC6B21ADBB8500E85E34; + productRefGroup = 8464AC7521ADBB8500E85E34 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( - 8E9AA972219C92880012896B /* Detail */, + 8464AC7321ADBB8500E85E34 /* Table Project */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 8E9AA971219C92880012896B /* Resources */ = { + 8464AC7221ADBB8500E85E34 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 8E9AA981219C928B0012896B /* LaunchScreen.storyboard in Resources */, - 8E9AA97E219C928B0012896B /* Assets.xcassets in Resources */, - 8E9AA98F219C93170012896B /* EntryCell.xib in Resources */, - 8E9AA98D219C93100012896B /* PersonCell.xib in Resources */, - 8E9AA97C219C92880012896B /* Main.storyboard in Resources */, + 8464AC8221ADBB8700E85E34 /* LaunchScreen.storyboard in Resources */, + 8464AC7F21ADBB8700E85E34 /* Assets.xcassets in Resources */, + 8464AC7D21ADBB8500E85E34 /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 8E9AA96F219C92880012896B /* Sources */ = { + 8464AC7021ADBB8500E85E34 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 8E4DE79A219C9F3800AFE381 /* Person.swift in Sources */, - 8E4DE79C219CA16500AFE381 /* TableViewController.swift in Sources */, - 8E4DE798219C9EB200AFE381 /* Model.swift in Sources */, - 8E9AA989219C92CB0012896B /* PersonCell.swift in Sources */, - 8E9AA98B219C92D50012896B /* EntryCell.swift in Sources */, - 8E4DE79E219CAA7700AFE381 /* ModelUpdateClient.swift in Sources */, - 8E9AA977219C92880012896B /* AppDelegate.swift in Sources */, - 8E9AA991219C9BDD0012896B /* DetailViewController.swift in Sources */, + 8464AC9021ADC23300E85E34 /* PersonTableViewController.swift in Sources */, + 8464AC8C21ADC1D800E85E34 /* PersonCell.swift in Sources */, + 8464AC8A21ADC1BC00E85E34 /* AddPersonCell.swift in Sources */, + 8464AC9221ADC26200E85E34 /* Model.swift in Sources */, + 8464AC9421ADC27300E85E34 /* Person.swift in Sources */, + 8464AC7821ADBB8500E85E34 /* AppDelegate.swift in Sources */, + 8464AC8E21ADC20E00E85E34 /* DetailViewController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ - 8E9AA97A219C92880012896B /* Main.storyboard */ = { + 8464AC7B21ADBB8500E85E34 /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( - 8E9AA97B219C92880012896B /* Base */, + 8464AC7C21ADBB8500E85E34 /* Base */, ); name = Main.storyboard; sourceTree = ""; }; - 8E9AA97F219C928B0012896B /* LaunchScreen.storyboard */ = { + 8464AC8021ADBB8700E85E34 /* LaunchScreen.storyboard */ = { isa = PBXVariantGroup; children = ( - 8E9AA980219C928B0012896B /* Base */, + 8464AC8121ADBB8700E85E34 /* Base */, ); name = LaunchScreen.storyboard; sourceTree = ""; @@ -194,7 +182,7 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ - 8E9AA983219C928B0012896B /* Debug */ = { + 8464AC8421ADBB8700E85E34 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -255,7 +243,7 @@ }; name = Debug; }; - 8E9AA984219C928B0012896B /* Release */ = { + 8464AC8521ADBB8700E85E34 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -310,36 +298,34 @@ }; name = Release; }; - 8E9AA986219C928B0012896B /* Debug */ = { + 8464AC8721ADBB8700E85E34 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = 2W4DVPEQ39; - INFOPLIST_FILE = Detail/Info.plist; + INFOPLIST_FILE = "Table Project/Info.plist"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.sadun.Detail; + PRODUCT_BUNDLE_IDENTIFIER = "com.audreywelch.Table-Project"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; - 8E9AA987219C928B0012896B /* Release */ = { + 8464AC8821ADBB8700E85E34 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = 2W4DVPEQ39; - INFOPLIST_FILE = Detail/Info.plist; + INFOPLIST_FILE = "Table Project/Info.plist"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.sadun.Detail; + PRODUCT_BUNDLE_IDENTIFIER = "com.audreywelch.Table-Project"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; @@ -349,25 +335,25 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 8E9AA96E219C92880012896B /* Build configuration list for PBXProject "Detail" */ = { + 8464AC6F21ADBB8500E85E34 /* Build configuration list for PBXProject "Table Project" */ = { isa = XCConfigurationList; buildConfigurations = ( - 8E9AA983219C928B0012896B /* Debug */, - 8E9AA984219C928B0012896B /* Release */, + 8464AC8421ADBB8700E85E34 /* Debug */, + 8464AC8521ADBB8700E85E34 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 8E9AA985219C928B0012896B /* Build configuration list for PBXNativeTarget "Detail" */ = { + 8464AC8621ADBB8700E85E34 /* Build configuration list for PBXNativeTarget "Table Project" */ = { isa = XCConfigurationList; buildConfigurations = ( - 8E9AA986219C928B0012896B /* Debug */, - 8E9AA987219C928B0012896B /* Release */, + 8464AC8721ADBB8700E85E34 /* Debug */, + 8464AC8821ADBB8700E85E34 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; - rootObject = 8E9AA96B219C92880012896B /* Project object */; + rootObject = 8464AC6C21ADBB8500E85E34 /* Project object */; } diff --git a/Detail copy for wk 4.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Table Project - Student & Cohort copy/Table Project.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 68% rename from Detail copy for wk 4.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to Table Project - Student & Cohort copy/Table Project.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 50d85f8..98bf322 100644 --- a/Detail copy for wk 4.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/Table Project - Student & Cohort copy/Table Project.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:Table Project.xcodeproj"> diff --git a/Detail copy for wk 4.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Table Project - Student & Cohort copy/Table Project.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from Detail copy for wk 4.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to Table Project - Student & Cohort copy/Table Project.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/Table Project - Student & Cohort copy/Table Project.xcodeproj/project.xcworkspace/xcuserdata/audreywelch.xcuserdatad/UserInterfaceState.xcuserstate b/Table Project - Student & Cohort copy/Table Project.xcodeproj/project.xcworkspace/xcuserdata/audreywelch.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..0e2f3ca310dfa73a3e541315e76b545802a1a09c GIT binary patch literal 41196 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 SchemeUserState - Detail.xcscheme_^#shared#^_ + Table Project.xcscheme_^#shared#^_ orderHint 0 diff --git a/Table Project - Student & Cohort copy/Table Project/AddPersonCell.swift b/Table Project - Student & Cohort copy/Table Project/AddPersonCell.swift new file mode 100644 index 0000000..ee4763f --- /dev/null +++ b/Table Project - Student & Cohort copy/Table Project/AddPersonCell.swift @@ -0,0 +1,14 @@ +import UIKit + +class AddPersonCell: UITableViewCell { + static let reuseIdentifier = "addpersoncell" + + // Add text fields where people will enter info in + + @IBOutlet weak var nameField: UITextField! + @IBOutlet weak var cohortField: UITextField! + + + + +} diff --git a/Detail/AppDelegate.swift b/Table Project - Student & Cohort copy/Table Project/AppDelegate.swift similarity index 97% rename from Detail/AppDelegate.swift rename to Table Project - Student & Cohort copy/Table Project/AppDelegate.swift index 31619e2..2b6e83c 100644 --- a/Detail/AppDelegate.swift +++ b/Table Project - Student & Cohort copy/Table Project/AppDelegate.swift @@ -1,10 +1,16 @@ + + import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { + var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { return true } + + } + diff --git a/Detail/Assets.xcassets/AppIcon.appiconset/Contents.json b/Table Project - Student & Cohort copy/Table Project/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from Detail/Assets.xcassets/AppIcon.appiconset/Contents.json rename to Table Project - Student & Cohort copy/Table Project/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/Detail/Assets.xcassets/Contents.json b/Table Project - Student & Cohort copy/Table Project/Assets.xcassets/Contents.json similarity index 100% rename from Detail/Assets.xcassets/Contents.json rename to Table Project - Student & Cohort copy/Table Project/Assets.xcassets/Contents.json diff --git a/Detail/Base.lproj/LaunchScreen.storyboard b/Table Project - Student & Cohort copy/Table Project/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from Detail/Base.lproj/LaunchScreen.storyboard rename to Table Project - Student & Cohort copy/Table Project/Base.lproj/LaunchScreen.storyboard diff --git a/Detail/Base.lproj/Main.storyboard b/Table Project - Student & Cohort copy/Table Project/Base.lproj/Main.storyboard similarity index 61% rename from Detail/Base.lproj/Main.storyboard rename to Table Project - Student & Cohort copy/Table Project/Base.lproj/Main.storyboard index efdd8b3..a666d58 100644 --- a/Detail/Base.lproj/Main.storyboard +++ b/Table Project - Student & Cohort copy/Table Project/Base.lproj/Main.storyboard @@ -1,5 +1,5 @@ - + @@ -10,227 +10,231 @@ - - + + - - + + - - + + - - + + - - + + - - + + - - - + + - - - - + + - - - - - + + + + + + - - + + - - + + - - + + - - + + - + + + - - - - + + + + - - - + + + - - + + - + - + - + - + - - + + - - + + - - + + - - - + + - - - - + + - - - + + + + + - + - - + + - + - + - + - - + + - + - + - + diff --git a/Table Project - Student & Cohort copy/Table Project/DetailViewController.swift b/Table Project - Student & Cohort copy/Table Project/DetailViewController.swift new file mode 100644 index 0000000..cdbcef1 --- /dev/null +++ b/Table Project - Student & Cohort copy/Table Project/DetailViewController.swift @@ -0,0 +1,45 @@ +import UIKit + +class DetailViewController: UIViewController { + + @IBOutlet weak var cohortField: UITextField! + + @IBOutlet weak var nameField: UITextField! + + // This property allows the detail view controller to have a reference + // + var person: Person? + + @IBAction func save(_ sender: Any) { + // update our person in our model - but first add a property above (var person) because we don't have anything to work with + + // unwrap in order to check to see there is a person + guard let person = person else { return } + + // if user has deleted the information in the field, we don't want to save it - so we will make two tests + // check to see if there is text there + // check to see whether or not the text is empty + guard let name = nameField.text, !name.isEmpty else { return } + + // Perform our edits + person.name = name + person.cohort = cohortField.text ?? "" // nil coalescing, if the result is nil, give it a fallback value (an empty string) + + // Leave + navigationController?.popViewController(animated: true) // Optional/Conditional Chaining: if there is a value in the navigation controller, perform what comes after the question mark. otherwise don't do anything. + + } + + // Called just before view controller appears on-screen + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + + // Ensure we have a person to present + guard let person = person else { return } + + // Populate the two text fields + nameField.text = person.name + cohortField.text = person.cohort + } +} + diff --git a/Detail/Info.plist b/Table Project - Student & Cohort copy/Table Project/Info.plist similarity index 100% rename from Detail/Info.plist rename to Table Project - Student & Cohort copy/Table Project/Info.plist diff --git a/Table Project - Student & Cohort copy/Table Project/Model.swift b/Table Project - Student & Cohort copy/Table Project/Model.swift new file mode 100644 index 0000000..596b6a4 --- /dev/null +++ b/Table Project - Student & Cohort copy/Table Project/Model.swift @@ -0,0 +1,57 @@ +import Foundation + +class Model { + // MARK: Singleton + static let shared = Model() + private init() {} + + // MARK: Core Storage + // Store our people + var people: [Person] = [] + + // Basic information that helps our model to manage people and add to our table + + // MARK: - Model Management (CRUD) + + // add person - C + func add(person: Person) { + people.append(person) + saveData() + } + + // remove person - D + func remove(personAtIndex index: Int) { + people.remove(at: index) + saveData() + } + + // count - R + func numberOfPeople() -> Int { + return people.count + } + + // move - U + func movePerson(at index: Int, to newIndex: Int) { + // TODO: Implement this + } + + // find which person is at an index - R + func person(at index: Int) -> Person { + return people[index] + } + + // MARK: Data Persistence + + // save data + func saveData() { + // TODO: Implement this + // This shows up in the Table of Contents to the right of Model.swift at the top to show you that you need to do something + } + + // load data + func loadData() { + // TODO: Implement this + } + + +} diff --git a/Table Project - Student & Cohort copy/Table Project/Person.swift b/Table Project - Student & Cohort copy/Table Project/Person.swift new file mode 100644 index 0000000..9a2e824 --- /dev/null +++ b/Table Project - Student & Cohort copy/Table Project/Person.swift @@ -0,0 +1,15 @@ +import Foundation + +class Person { + var name: String // = "" + var cohort: String + + //initializer + init(name: String, cohort: String) { + self.name = name + self.cohort = cohort + + // Fancy way to intiliaze + //(self.name, self.cohort) = (name, cohort) + } +} diff --git a/Table Project - Student & Cohort copy/Table Project/PersonCell.swift b/Table Project - Student & Cohort copy/Table Project/PersonCell.swift new file mode 100644 index 0000000..238600c --- /dev/null +++ b/Table Project - Student & Cohort copy/Table Project/PersonCell.swift @@ -0,0 +1,10 @@ +import UIKit + +class PersonCell: UITableViewCell { + static let reuseIdentifier = "personcell" + + // add labels + @IBOutlet var nameLabel: UILabel! + @IBOutlet var cohortLabel: UILabel! + +} diff --git a/Table Project - Student & Cohort copy/Table Project/PersonTableViewController.swift b/Table Project - Student & Cohort copy/Table Project/PersonTableViewController.swift new file mode 100644 index 0000000..a412efa --- /dev/null +++ b/Table Project - Student & Cohort copy/Table Project/PersonTableViewController.swift @@ -0,0 +1,100 @@ +import UIKit + +// +class PersonTableViewController: UITableViewController { + + override func numberOfSections(in tableView: UITableView) -> Int { + return 2 + } + + override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + // switch statement + switch section { + case 0: + return 1 // return 1 row in section 0 (the add person section) + case 1: + return Model.shared.numberOfPeople() + default: + fatalError("Invalid section number") + } + } + + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + if indexPath.section == 0 { + // get a cell + let cell = tableView.dequeueReusableCell(withIdentifier: AddPersonCell.reuseIdentifier, for: indexPath) + return cell + } + + // Handle PersonCell from here forward + // conditional casting because we need to specialize the cell + guard let cell = tableView.dequeueReusableCell(withIdentifier: PersonCell.reuseIdentifier, for: indexPath) as? PersonCell + else { fatalError("Unable to dequeue person cell") } + + // put information into the person cell - populating the person cell + // grab a person + let person = Model.shared.person(at: indexPath.row) + cell.nameLabel.text = person.name + cell.cohortLabel.text = person.cohort + + return cell + } + + @IBAction func add() { + // how many addPersonCells will we have at one time? Always guaranteed that there will be one. So we can grab that single add person cell and cast it to the right type + guard let cell = tableView.cellForRow(at: IndexPath(row: 0, section: 0)) as? AddPersonCell + else { return } + + // grab text from the nameField, check to make sure it is not empty, and if it's not empty, then continue (ensure that the name is not empty) + guard let name = cell.nameField.text, !name.isEmpty + else { return } + + // If nil, set it to the empty string (ensure that we ahve a string and not nil + let cohort = cell.cohortField.text ?? "" + + // construct a person + let person = Person(name: name, cohort: cohort) + + // Clear the textField after entered and saved + cell.nameField.text = "" + cell.cohortField.text = "" + + // add to the model + Model.shared.add(person: person) + // update our table view + tableView.reloadData() + + } + + // reload when we return from the detail view (ensure that the table view reloads whenever we return from the detail view controller) + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + tableView.reloadData() + } + + // Cell height information - set custom heights for each section + override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + switch indexPath.row { + case 0: + return 150 + default: + return 160 + } + } + + // Prepare for segue allows us to pass forward information that the segue's destination can use to set up its views + // Rule of thumb: NEVER EDIT ANOTHER VIEW CONTROLLER'S FIELDS DIRECTLY, because it might not have enough time to load between screens and you will crash + // Sending information is safe, editing views is unsafe + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + // fetch index path + // fetch view controller + guard + let destination = segue.destination as? DetailViewController, + let indexPath = tableView.indexPathForSelectedRow + else { return } + + let person = Model.shared.person(at: indexPath.row) + destination.person = person + } + +} From 5983d2333e008eedcf9d0b4cb96568ec155df9c5 Mon Sep 17 00:00:00 2001 From: Audrey Welch Date: Thu, 6 Dec 2018 16:46:37 -0600 Subject: [PATCH 3/4] Firebase protocol created and Firebase.swift file set up --- .DS_Store | Bin 6148 -> 6148 bytes .../.DS_Store | Bin 0 -> 6148 bytes .../project.pbxproj | 14 +- .../contents.xcworkspacedata | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../UserInterfaceState.xcuserstate | Bin 0 -> 44144 bytes .../xcschemes/xcschememanagement.plist | 0 .../UserInterfaceState.xcuserstate | Bin 41196 -> 0 bytes .../Table Project/Firebase.swift | 178 ++++++++++++++++++ .../Table Project/FirebaseItem.swift | 8 + .../Table Project/Person.swift | 3 +- 11 files changed, 199 insertions(+), 4 deletions(-) create mode 100644 Table Project - Student & Cohort copy/.DS_Store rename Table Project - Student & Cohort copy/{Table Project.xcodeproj => Table Project - copy.xcodeproj}/project.pbxproj (93%) rename Table Project - Student & Cohort copy/{Table Project.xcodeproj => Table Project - copy.xcodeproj}/project.xcworkspace/contents.xcworkspacedata (100%) rename Table Project - Student & Cohort copy/{Table Project.xcodeproj => Table Project - copy.xcodeproj}/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) create mode 100644 Table Project - Student & Cohort copy/Table Project - copy.xcodeproj/project.xcworkspace/xcuserdata/audreywelch.xcuserdatad/UserInterfaceState.xcuserstate rename Table Project - Student & Cohort copy/{Table Project.xcodeproj => Table Project - copy.xcodeproj}/xcuserdata/audreywelch.xcuserdatad/xcschemes/xcschememanagement.plist (100%) delete mode 100644 Table Project - Student & Cohort copy/Table Project.xcodeproj/project.xcworkspace/xcuserdata/audreywelch.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 Table Project - Student & Cohort copy/Table Project/Firebase.swift create mode 100644 Table Project - Student & Cohort copy/Table Project/FirebaseItem.swift diff --git a/.DS_Store b/.DS_Store index 1836d741a01cc978915afc572e459fc1bc1cfce3..072f5dbd7a05dc6b82353a6daa7a1d29e15b3dcc 100644 GIT binary patch delta 100 zcmZoMXffCz$;NncvJ_i`r$lwNv4M_)si|45jzYDefvKsEg0Yc7Z7nBM8XF_ge kRdr2m-Ao2BU}S{Q4E#_UM$MXhfYooZ5&PB6Y#jgi0khH-)Bpeg delta 101 zcmZoMXffCz$;NnUvJ_i`mt=Ldp`o#kf~l!dt&T#qp@FHXj)Jj~L2WH3hq$Vtt!F}R lWmR=eZQU#eFkoba&6$c_*X(e0QC|KKs<1Fk1{Q#QWH4?~ioSwXOx2@Jd!@59*%&KiTw{X{4gE)o-LamxJDTSf-qn^47CJtweIk`H)pi=0gdtC5WokmBS+Tg?O8GV XRYiMOjiP!>r^Z3RfJ6}leu2On??EsX literal 0 HcmV?d00001 diff --git a/Table Project - Student & Cohort copy/Table Project.xcodeproj/project.pbxproj b/Table Project - Student & Cohort copy/Table Project - copy.xcodeproj/project.pbxproj similarity index 93% rename from Table Project - Student & Cohort copy/Table Project.xcodeproj/project.pbxproj rename to Table Project - Student & Cohort copy/Table Project - copy.xcodeproj/project.pbxproj index 849b81c..e2a8b77 100644 --- a/Table Project - Student & Cohort copy/Table Project.xcodeproj/project.pbxproj +++ b/Table Project - Student & Cohort copy/Table Project - copy.xcodeproj/project.pbxproj @@ -7,6 +7,8 @@ objects = { /* Begin PBXBuildFile section */ + 841F119321B9CED7002BFD09 /* FirebaseItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 841F119221B9CED6002BFD09 /* FirebaseItem.swift */; }; + 841F119521B9CF9D002BFD09 /* Firebase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 841F119421B9CF9D002BFD09 /* Firebase.swift */; }; 8464AC7821ADBB8500E85E34 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8464AC7721ADBB8500E85E34 /* AppDelegate.swift */; }; 8464AC7D21ADBB8500E85E34 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8464AC7B21ADBB8500E85E34 /* Main.storyboard */; }; 8464AC7F21ADBB8700E85E34 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8464AC7E21ADBB8700E85E34 /* Assets.xcassets */; }; @@ -20,6 +22,8 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 841F119221B9CED6002BFD09 /* FirebaseItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirebaseItem.swift; sourceTree = ""; }; + 841F119421B9CF9D002BFD09 /* Firebase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Firebase.swift; sourceTree = ""; }; 8464AC7421ADBB8500E85E34 /* Table Project.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Table Project.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 8464AC7721ADBB8500E85E34 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 8464AC7C21ADBB8500E85E34 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; @@ -66,10 +70,12 @@ children = ( 8464AC7721ADBB8500E85E34 /* AppDelegate.swift */, 8464AC7B21ADBB8500E85E34 /* Main.storyboard */, - 8464AC9121ADC26200E85E34 /* Model.swift */, + 841F119221B9CED6002BFD09 /* FirebaseItem.swift */, + 841F119421B9CF9D002BFD09 /* Firebase.swift */, 8464AC9321ADC27300E85E34 /* Person.swift */, 8464AC8B21ADC1D800E85E34 /* PersonCell.swift */, 8464AC8921ADC1BC00E85E34 /* AddPersonCell.swift */, + 8464AC9121ADC26200E85E34 /* Model.swift */, 8464AC8D21ADC20E00E85E34 /* DetailViewController.swift */, 8464AC8F21ADC23300E85E34 /* PersonTableViewController.swift */, 8464AC7E21ADBB8700E85E34 /* Assets.xcassets */, @@ -114,7 +120,7 @@ }; }; }; - buildConfigurationList = 8464AC6F21ADBB8500E85E34 /* Build configuration list for PBXProject "Table Project" */; + buildConfigurationList = 8464AC6F21ADBB8500E85E34 /* Build configuration list for PBXProject "Table Project - copy" */; compatibilityVersion = "Xcode 9.3"; developmentRegion = en; hasScannedForEncodings = 0; @@ -155,6 +161,8 @@ 8464AC8A21ADC1BC00E85E34 /* AddPersonCell.swift in Sources */, 8464AC9221ADC26200E85E34 /* Model.swift in Sources */, 8464AC9421ADC27300E85E34 /* Person.swift in Sources */, + 841F119321B9CED7002BFD09 /* FirebaseItem.swift in Sources */, + 841F119521B9CF9D002BFD09 /* Firebase.swift in Sources */, 8464AC7821ADBB8500E85E34 /* AppDelegate.swift in Sources */, 8464AC8E21ADC20E00E85E34 /* DetailViewController.swift in Sources */, ); @@ -335,7 +343,7 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 8464AC6F21ADBB8500E85E34 /* Build configuration list for PBXProject "Table Project" */ = { + 8464AC6F21ADBB8500E85E34 /* Build configuration list for PBXProject "Table Project - copy" */ = { isa = XCConfigurationList; buildConfigurations = ( 8464AC8421ADBB8700E85E34 /* Debug */, diff --git a/Table Project - Student & Cohort copy/Table Project.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Table Project - Student & Cohort copy/Table Project - copy.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from Table Project - Student & Cohort copy/Table Project.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to Table Project - Student & Cohort copy/Table Project - copy.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/Table Project - Student & Cohort copy/Table Project.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Table Project - Student & Cohort copy/Table Project - copy.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from Table Project - Student & Cohort copy/Table Project.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to Table Project - Student & Cohort copy/Table Project - copy.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/Table Project - Student & Cohort copy/Table Project - copy.xcodeproj/project.xcworkspace/xcuserdata/audreywelch.xcuserdatad/UserInterfaceState.xcuserstate b/Table Project - Student & Cohort copy/Table Project - copy.xcodeproj/project.xcworkspace/xcuserdata/audreywelch.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..65f7861c092e71a4fed63464d9e81afe673c26fa GIT binary patch literal 44144 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 { + + // Base URL + static var baseURL: URL! { return URL(string:"https://names-and-cohorts.firebaseio.com/") } + + // Function that constructs a URL specific to my method, passes the method as a string. + static func requestURL(_ method: String, for recordIdentifier: String = "unknownid") -> URL { + switch method { + case "POST": + // Post to the main database. It will return a new record identifier + return baseURL.appendingPathExtension("json") + case "DELETE", "PUT", "GET": + // You need the record identifier in your URL, except if accessing all the records at once + return baseURL + // return the baseURL + the recordIdentifier + .json + .appendingPathComponent(recordIdentifier) + .appendingPathExtension("json") + default: + fatalError("Unknown request method: \(method)") + } + } + + // Handle a single request: meant for DELETE, PUT, POST. + static func processRequest( + method: String, // Get PUT POST or DELETE + for item: Item, // Conforms to Codable & FirebaseItem (so that we have a record id field) + with completion: @escaping (_ success: Bool) -> Void = { _ in } + ) { + + // Fetch appropriate request URL customized in method by creating a URL request + var request = URLRequest(url: requestURL(method, for: item.recordIdentifier)) + //set the http method + request.httpMethod = method + + // Encode this record + do { + // fill out the request body - needed when pushing info to a service + request.httpBody = try JSONEncoder().encode(item) + } catch { + NSLog("Unable to encode \(item): \(error)") + completion(false) + return + } + + + // Create a data task to perform request, then add a completion handler + let dataTask = URLSession.shared.dataTask(with: request) { data, _, error in + + // Fail on error + if let error = error { + NSLog("Server \(method) error: \(error)") + completion(false) // run a completion + return + } + + // If we have reached this point, we haven't failed and there is data + + // Handle PUT, GET, DELETE, then leave the function + guard method == "POST" else { + completion(true) // Successful with our completion and leave + return + } + + // If it is POST, then we continue + + // Process POST requests by posting it, getting the record id, adding record id to device, save it again + + // Fetch identifier from POST + // Look at data and make sure it is a dictionary with a name and record identifier + guard let data = data else { + NSLog("Invalid server response data") + completion(false) + return + } + + // If we do have the data, decode + do { + + // POST request returns `["name": recordIdentifier]` - Store the record identifier, not the name + let nameDict = try JSONDecoder().decode([String: String].self, from: data) + // make sure there is an entry for the record ID + guard let name = nameDict["name"] else { + completion(false) // if not, fail and leave + return + } + + // Update record and store that name. POST is now successful and includes the recordIdentifier as part of the item record. + item.recordIdentifier = name // set it to the recordIdentifier + processRequest(method: "PUT", for: item)// PUT it back to the server + completion(true) // complete + + } catch { + + // if error during decoding, log the error, and completion false + NSLog("Error decoding JSON response: \(error)") + completion(false) + return + } + + } + + dataTask.resume() // data task doesn't do anything until we resume + + } + + // Three useful entry points that we will call + // Delete, Save, Fetch + + static func delete(item: Item, completion: @escaping (_ success: Bool) -> Void = { _ in}) { + // call the method DELETE for that item + processRequest(method: "DELETE", for: item, with: completion) + } + + static func save(item: Item, completion: @escaping (_ success: Bool) -> Void = { _ in}) { + // if nothing in the recordIdentifier, POST it + switch item.recordIdentifier.isEmpty { + case true: // POST, new record, "create" + processRequest(method: "POST", for: item, with: completion) + // if there is, replace it instead of store it + case false: // PUT, existing record, "update" + processRequest(method: "PUT", for: item, with: completion) + } + } + + // Fetch all records and pass them to sender via completion handler + static func fetchRecords(completion: @escaping ([Item]?) -> Void) { + // append the path extension json + let requestURL = baseURL.appendingPathExtension("json") + // create a data task, don't need a request because it's a reading method + let dataTask = URLSession.shared.dataTask(with: requestURL) { data, _, error in + + // make sure I don't have an error and there is data for me to use + guard error == nil, let data = data else { + if let error = error { + NSLog("Error fetching entries: \(error)") + } + completion(nil) + return + } + + // if it does work... + do { + + // decode string: item - record ID followed by the item + let recordDict = try JSONDecoder().decode([String: Item].self, from: data) + // extra safety + for (key, value) in recordDict { value.recordIdentifier = key } + // Map - We don't care about the record ID, so take the value out of the pair and that becomes the list of records + // This converts the [[id: item]] array of dictionary entries into an array of items + let records = recordDict.map({ $0.value }) + // call completion with my list of records + completion(records) + } catch { + NSLog("Error decoding received data: \(error)") + // Start it off with an empty list + completion([]) + } + } + + dataTask.resume() + } + +} diff --git a/Table Project - Student & Cohort copy/Table Project/FirebaseItem.swift b/Table Project - Student & Cohort copy/Table Project/FirebaseItem.swift new file mode 100644 index 0000000..1d8ea95 --- /dev/null +++ b/Table Project - Student & Cohort copy/Table Project/FirebaseItem.swift @@ -0,0 +1,8 @@ + +import Foundation + +// This is a protocol +// Anything that supplies a record identifier and conforms to the protocol, we can use +protocol FirebaseItem: class { + var recordIdentifier: String { get set } +} diff --git a/Table Project - Student & Cohort copy/Table Project/Person.swift b/Table Project - Student & Cohort copy/Table Project/Person.swift index 9a2e824..8916e17 100644 --- a/Table Project - Student & Cohort copy/Table Project/Person.swift +++ b/Table Project - Student & Cohort copy/Table Project/Person.swift @@ -1,8 +1,9 @@ import Foundation -class Person { +class Person: Codable, FirebaseItem { var name: String // = "" var cohort: String + var recordIdentifier = "" //initializer init(name: String, cohort: String) { From 1ef77f84660ae9a2baffc6c3d0ddad57a1939804 Mon Sep 17 00:00:00 2001 From: Audrey Welch Date: Thu, 6 Dec 2018 18:52:31 -0600 Subject: [PATCH 4/4] Set up view controller methods to save data locally and remotely and created ability to update firebase with changes made in the app --- .../UserInterfaceState.xcuserstate | Bin 44144 -> 45406 bytes .../Table Project/DetailViewController.swift | 6 +++ .../Table Project/Model.swift | 48 ++++++++++++++++-- .../PersonTableViewController.swift | 47 ++++++++++++++--- 4 files changed, 88 insertions(+), 13 deletions(-) diff --git a/Table Project - Student & Cohort copy/Table Project - copy.xcodeproj/project.xcworkspace/xcuserdata/audreywelch.xcuserdatad/UserInterfaceState.xcuserstate b/Table Project - Student & Cohort copy/Table Project - copy.xcodeproj/project.xcworkspace/xcuserdata/audreywelch.xcuserdatad/UserInterfaceState.xcuserstate index 65f7861c092e71a4fed63464d9e81afe673c26fa..625397bb4389e6ee263f5ce74f2cfbffb71857ad 100644 GIT binary patch delta 18996 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 delta 17730 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 Void) { + + // Local: Append it to our devices array people.append(person) - saveData() + + // Remote: Save it by sending it to firebase + Firebase.save(item: person) { success in + guard success else { return } + + // otherwise do the completion on the main thread + DispatchQueue.main.async { completion() } + } + } + + func updatePerson(person: Person, completion: @escaping () -> Void ) { + + // Get a person + //let person = people[indexPath.row] + + // Local - change the person string + //person.name = + + // Remote + Firebase.save(item: person) { success in + guard success else { return } + DispatchQueue.main.async { completion() } + + } } // remove person - D - func remove(personAtIndex index: Int) { - people.remove(at: index) - saveData() + func removePerson(at indexPath: IndexPath, completion: @escaping () -> Void ) { + + // Get a person + let person = people[indexPath.row] + + // Local + people.remove(at: indexPath.row) + + // Remote + Firebase.delete(item: person) { success in + guard success else { return } + DispatchQueue.main.async { completion() } + } } // count - R @@ -40,10 +75,13 @@ class Model { return people[index] } + + // MARK: Data Persistence // save data func saveData() { + // TODO: Implement this // This shows up in the Table of Contents to the right of Model.swift at the top to show you that you need to do something } diff --git a/Table Project - Student & Cohort copy/Table Project/PersonTableViewController.swift b/Table Project - Student & Cohort copy/Table Project/PersonTableViewController.swift index a412efa..28b1469 100644 --- a/Table Project - Student & Cohort copy/Table Project/PersonTableViewController.swift +++ b/Table Project - Student & Cohort copy/Table Project/PersonTableViewController.swift @@ -3,10 +3,33 @@ import UIKit // class PersonTableViewController: UITableViewController { + + // reload when we return from the detail view (ensure that the table view reloads whenever we return from the detail view controller) + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + + + // Fetch records from Firebase and reload the table view + Firebase.fetchRecords { people in + if let people = people { + Model.shared.people = people + + DispatchQueue.main.async { + self.tableView.reloadData() + + } + } + } + + + } + + // Number of sections override func numberOfSections(in tableView: UITableView) -> Int { return 2 } + // Number of rows override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { // switch statement switch section { @@ -19,6 +42,7 @@ class PersonTableViewController: UITableViewController { } } + // Cell contents override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { if indexPath.section == 0 { // get a cell @@ -40,6 +64,17 @@ class PersonTableViewController: UITableViewController { return cell } + // Delete a person, update Firebase, update model, and reload data + override func tableView(_ tableViewPassedToUs: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { + + guard editingStyle == .delete else { return } + + Model.shared.removePerson(at: indexPath) { + self.tableView.reloadData() + } + } + + // Add a new person, store it at Firebase, update model, and reload data @IBAction func add() { // how many addPersonCells will we have at one time? Always guaranteed that there will be one. So we can grab that single add person cell and cast it to the right type guard let cell = tableView.cellForRow(at: IndexPath(row: 0, section: 0)) as? AddPersonCell @@ -60,17 +95,13 @@ class PersonTableViewController: UITableViewController { cell.cohortField.text = "" // add to the model - Model.shared.add(person: person) - // update our table view - tableView.reloadData() + Model.shared.addNewPerson(person: person) { + self.tableView.reloadData() + } } - // reload when we return from the detail view (ensure that the table view reloads whenever we return from the detail view controller) - override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(animated) - tableView.reloadData() - } + // Cell height information - set custom heights for each section override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {