From 3bc9f5d2c8ecb9140b96b3c14d8a36b1f26a08bd Mon Sep 17 00:00:00 2001 From: Sean Doyle Date: Wed, 12 Dec 2018 16:49:03 -0500 Subject: [PATCH 1/3] Initial commit --- Answers.txt | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 Answers.txt diff --git a/Answers.txt b/Answers.txt new file mode 100644 index 0000000..0c809f4 --- /dev/null +++ b/Answers.txt @@ -0,0 +1,23 @@ +What is a RESTful interface? When do you use it? What are its characteristics? + + +What is the difference between POST and PUT? +Put updates info, while POST adds new info. + + +How does the record ID work in Firebase? + + +Why does it take two steps to save a record (first POST then PUT) in our app? + +Why does the FirebaseItem protocol even exist? + + +Explain what a generic type is and what advantages it offers. + +What does a URLRequest do? + +When do you need one and when can you just use a URL? +What is the role of a URL session? How does it work? +What are completion handlers? Why use completion handlers? What advantages do they provide? +Explain at least three strategies that promote code reuse that we used in today's project \ No newline at end of file From a24feb20adfc31a2cb67bc43963745356e5b5551 Mon Sep 17 00:00:00 2001 From: Sean Doyle Date: Wed, 12 Dec 2018 17:17:17 -0500 Subject: [PATCH 2/3] Storyboard completed --- .../12.12 Firebase.xcodeproj/project.pbxproj | 341 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../UserInterfaceState.xcuserstate | Bin 0 -> 11569 bytes .../xcschemes/xcschememanagement.plist | 14 + .../12.12 Firebase/AppDelegate.swift | 46 +++ .../AppIcon.appiconset/Contents.json | 98 +++++ .../Assets.xcassets/Contents.json | 6 + .../Base.lproj/LaunchScreen.storyboard | 25 ++ .../12.12 Firebase/Base.lproj/Main.storyboard | 78 ++++ 12.12 Firebase/12.12 Firebase/Info.plist | 45 +++ .../12.12 Firebase/ViewController.swift | 20 + Answers.txt | 3 + 13 files changed, 691 insertions(+) create mode 100644 12.12 Firebase/12.12 Firebase.xcodeproj/project.pbxproj create mode 100644 12.12 Firebase/12.12 Firebase.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 12.12 Firebase/12.12 Firebase.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 12.12 Firebase/12.12 Firebase.xcodeproj/project.xcworkspace/xcuserdata/lambda_school_loaner_18.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 12.12 Firebase/12.12 Firebase.xcodeproj/xcuserdata/lambda_school_loaner_18.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 12.12 Firebase/12.12 Firebase/AppDelegate.swift create mode 100644 12.12 Firebase/12.12 Firebase/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 12.12 Firebase/12.12 Firebase/Assets.xcassets/Contents.json create mode 100644 12.12 Firebase/12.12 Firebase/Base.lproj/LaunchScreen.storyboard create mode 100644 12.12 Firebase/12.12 Firebase/Base.lproj/Main.storyboard create mode 100644 12.12 Firebase/12.12 Firebase/Info.plist create mode 100644 12.12 Firebase/12.12 Firebase/ViewController.swift diff --git a/12.12 Firebase/12.12 Firebase.xcodeproj/project.pbxproj b/12.12 Firebase/12.12 Firebase.xcodeproj/project.pbxproj new file mode 100644 index 0000000..a5822bb --- /dev/null +++ b/12.12 Firebase/12.12 Firebase.xcodeproj/project.pbxproj @@ -0,0 +1,341 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 84F4406621C1BD6C00DB30A9 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84F4406521C1BD6C00DB30A9 /* AppDelegate.swift */; }; + 84F4406821C1BD6C00DB30A9 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84F4406721C1BD6C00DB30A9 /* ViewController.swift */; }; + 84F4406B21C1BD6C00DB30A9 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 84F4406921C1BD6C00DB30A9 /* Main.storyboard */; }; + 84F4406D21C1BD6D00DB30A9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 84F4406C21C1BD6D00DB30A9 /* Assets.xcassets */; }; + 84F4407021C1BD6D00DB30A9 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 84F4406E21C1BD6D00DB30A9 /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 84F4406221C1BD6C00DB30A9 /* 12.12 Firebase.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "12.12 Firebase.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 84F4406521C1BD6C00DB30A9 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 84F4406721C1BD6C00DB30A9 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 84F4406A21C1BD6C00DB30A9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 84F4406C21C1BD6D00DB30A9 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 84F4406F21C1BD6D00DB30A9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 84F4407121C1BD6D00DB30A9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 84F4405F21C1BD6C00DB30A9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 84F4405921C1BD6B00DB30A9 = { + isa = PBXGroup; + children = ( + 84F4406421C1BD6C00DB30A9 /* 12.12 Firebase */, + 84F4406321C1BD6C00DB30A9 /* Products */, + ); + sourceTree = ""; + }; + 84F4406321C1BD6C00DB30A9 /* Products */ = { + isa = PBXGroup; + children = ( + 84F4406221C1BD6C00DB30A9 /* 12.12 Firebase.app */, + ); + name = Products; + sourceTree = ""; + }; + 84F4406421C1BD6C00DB30A9 /* 12.12 Firebase */ = { + isa = PBXGroup; + children = ( + 84F4406521C1BD6C00DB30A9 /* AppDelegate.swift */, + 84F4406721C1BD6C00DB30A9 /* ViewController.swift */, + 84F4406921C1BD6C00DB30A9 /* Main.storyboard */, + 84F4406C21C1BD6D00DB30A9 /* Assets.xcassets */, + 84F4406E21C1BD6D00DB30A9 /* LaunchScreen.storyboard */, + 84F4407121C1BD6D00DB30A9 /* Info.plist */, + ); + path = "12.12 Firebase"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 84F4406121C1BD6C00DB30A9 /* 12.12 Firebase */ = { + isa = PBXNativeTarget; + buildConfigurationList = 84F4407421C1BD6D00DB30A9 /* Build configuration list for PBXNativeTarget "12.12 Firebase" */; + buildPhases = ( + 84F4405E21C1BD6C00DB30A9 /* Sources */, + 84F4405F21C1BD6C00DB30A9 /* Frameworks */, + 84F4406021C1BD6C00DB30A9 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "12.12 Firebase"; + productName = "12.12 Firebase"; + productReference = 84F4406221C1BD6C00DB30A9 /* 12.12 Firebase.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 84F4405A21C1BD6B00DB30A9 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1010; + LastUpgradeCheck = 1010; + ORGANIZATIONNAME = Lambda_School_Loaner_18; + TargetAttributes = { + 84F4406121C1BD6C00DB30A9 = { + CreatedOnToolsVersion = 10.1; + }; + }; + }; + buildConfigurationList = 84F4405D21C1BD6B00DB30A9 /* Build configuration list for PBXProject "12.12 Firebase" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 84F4405921C1BD6B00DB30A9; + productRefGroup = 84F4406321C1BD6C00DB30A9 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 84F4406121C1BD6C00DB30A9 /* 12.12 Firebase */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 84F4406021C1BD6C00DB30A9 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 84F4407021C1BD6D00DB30A9 /* LaunchScreen.storyboard in Resources */, + 84F4406D21C1BD6D00DB30A9 /* Assets.xcassets in Resources */, + 84F4406B21C1BD6C00DB30A9 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 84F4405E21C1BD6C00DB30A9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 84F4406821C1BD6C00DB30A9 /* ViewController.swift in Sources */, + 84F4406621C1BD6C00DB30A9 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 84F4406921C1BD6C00DB30A9 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 84F4406A21C1BD6C00DB30A9 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 84F4406E21C1BD6D00DB30A9 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 84F4406F21C1BD6D00DB30A9 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 84F4407221C1BD6D00DB30A9 /* 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; + }; + 84F4407321C1BD6D00DB30A9 /* 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; + }; + 84F4407521C1BD6D00DB30A9 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 4L7P3ZX586; + INFOPLIST_FILE = "12.12 Firebase/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.lambdaschoolsd.-2-12-Firebase"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 84F4407621C1BD6D00DB30A9 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 4L7P3ZX586; + INFOPLIST_FILE = "12.12 Firebase/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.lambdaschoolsd.-2-12-Firebase"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 84F4405D21C1BD6B00DB30A9 /* Build configuration list for PBXProject "12.12 Firebase" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 84F4407221C1BD6D00DB30A9 /* Debug */, + 84F4407321C1BD6D00DB30A9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 84F4407421C1BD6D00DB30A9 /* Build configuration list for PBXNativeTarget "12.12 Firebase" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 84F4407521C1BD6D00DB30A9 /* Debug */, + 84F4407621C1BD6D00DB30A9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 84F4405A21C1BD6B00DB30A9 /* Project object */; +} diff --git a/12.12 Firebase/12.12 Firebase.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/12.12 Firebase/12.12 Firebase.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..90c5f8c --- /dev/null +++ b/12.12 Firebase/12.12 Firebase.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/12.12 Firebase/12.12 Firebase.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/12.12 Firebase/12.12 Firebase.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/12.12 Firebase/12.12 Firebase.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/12.12 Firebase/12.12 Firebase.xcodeproj/project.xcworkspace/xcuserdata/lambda_school_loaner_18.xcuserdatad/UserInterfaceState.xcuserstate b/12.12 Firebase/12.12 Firebase.xcodeproj/project.xcworkspace/xcuserdata/lambda_school_loaner_18.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..4be5647d4bd14cb63257d17d5682d35895abcc26 GIT binary patch literal 11569 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 Jj(uh*{|`<9L}vg1 literal 0 HcmV?d00001 diff --git a/12.12 Firebase/12.12 Firebase.xcodeproj/xcuserdata/lambda_school_loaner_18.xcuserdatad/xcschemes/xcschememanagement.plist b/12.12 Firebase/12.12 Firebase.xcodeproj/xcuserdata/lambda_school_loaner_18.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..f22554f --- /dev/null +++ b/12.12 Firebase/12.12 Firebase.xcodeproj/xcuserdata/lambda_school_loaner_18.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + 12.12 Firebase.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/12.12 Firebase/12.12 Firebase/AppDelegate.swift b/12.12 Firebase/12.12 Firebase/AppDelegate.swift new file mode 100644 index 0000000..840732b --- /dev/null +++ b/12.12 Firebase/12.12 Firebase/AppDelegate.swift @@ -0,0 +1,46 @@ +// +// AppDelegate.swift +// 12.12 Firebase +// +// Created by Lambda_School_Loaner_18 on 12/12/18. +// Copyright © 2018 Lambda_School_Loaner_18. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + func applicationWillResignActive(_ application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(_ application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(_ application: UIApplication) { + // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(_ application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(_ application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + +} + diff --git a/12.12 Firebase/12.12 Firebase/Assets.xcassets/AppIcon.appiconset/Contents.json b/12.12 Firebase/12.12 Firebase/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d8db8d6 --- /dev/null +++ b/12.12 Firebase/12.12 Firebase/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/12.12 Firebase/12.12 Firebase/Assets.xcassets/Contents.json b/12.12 Firebase/12.12 Firebase/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/12.12 Firebase/12.12 Firebase/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/12.12 Firebase/12.12 Firebase/Base.lproj/LaunchScreen.storyboard b/12.12 Firebase/12.12 Firebase/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..bfa3612 --- /dev/null +++ b/12.12 Firebase/12.12 Firebase/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/12.12 Firebase/12.12 Firebase/Base.lproj/Main.storyboard b/12.12 Firebase/12.12 Firebase/Base.lproj/Main.storyboard new file mode 100644 index 0000000..fe4d2f3 --- /dev/null +++ b/12.12 Firebase/12.12 Firebase/Base.lproj/Main.storyboard @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/12.12 Firebase/12.12 Firebase/Info.plist b/12.12 Firebase/12.12 Firebase/Info.plist new file mode 100644 index 0000000..16be3b6 --- /dev/null +++ b/12.12 Firebase/12.12 Firebase/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/12.12 Firebase/12.12 Firebase/ViewController.swift b/12.12 Firebase/12.12 Firebase/ViewController.swift new file mode 100644 index 0000000..72467d4 --- /dev/null +++ b/12.12 Firebase/12.12 Firebase/ViewController.swift @@ -0,0 +1,20 @@ +// +// ViewController.swift +// 12.12 Firebase +// +// Created by Lambda_School_Loaner_18 on 12/12/18. +// Copyright © 2018 Lambda_School_Loaner_18. All rights reserved. +// + +import UIKit + +class ViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + // Do any additional setup after loading the view, typically from a nib. + } + + +} + diff --git a/Answers.txt b/Answers.txt index 0c809f4..5d9b5c5 100644 --- a/Answers.txt +++ b/Answers.txt @@ -18,6 +18,9 @@ Explain what a generic type is and what advantages it offers. What does a URLRequest do? When do you need one and when can you just use a URL? + What is the role of a URL session? How does it work? + What are completion handlers? Why use completion handlers? What advantages do they provide? + Explain at least three strategies that promote code reuse that we used in today's project \ No newline at end of file From f46472a65ba3ba958a3aac7fb0b9a063fd739c1c Mon Sep 17 00:00:00 2001 From: Sean Doyle Date: Wed, 12 Dec 2018 19:14:21 -0500 Subject: [PATCH 3/3] Model updated --- .../12.12 Firebase.xcodeproj/project.pbxproj | 32 ++++- .../UserInterfaceState.xcuserstate | Bin 11569 -> 28103 bytes .../12.12 Firebase/Base.lproj/Main.storyboard | 60 ++++++++- 12.12 Firebase/12.12 Firebase/Firebase.swift | 121 ++++++++++++++++++ .../12.12 Firebase/FirebaseItem.swift | 5 + 12.12 Firebase/12.12 Firebase/Student.swift | 8 ++ .../12.12 Firebase/StudentModel.swift | 51 ++++++++ .../12.12 Firebase/StudentStyle.swift | 10 ++ .../StudentTableViewController.swift | 29 +++++ .../StudentViewController.swift | 13 ++ .../12.12 Firebase/ViewController.swift | 20 --- 11 files changed, 322 insertions(+), 27 deletions(-) create mode 100644 12.12 Firebase/12.12 Firebase/Firebase.swift create mode 100644 12.12 Firebase/12.12 Firebase/FirebaseItem.swift create mode 100644 12.12 Firebase/12.12 Firebase/Student.swift create mode 100644 12.12 Firebase/12.12 Firebase/StudentModel.swift create mode 100644 12.12 Firebase/12.12 Firebase/StudentStyle.swift create mode 100644 12.12 Firebase/12.12 Firebase/StudentTableViewController.swift create mode 100644 12.12 Firebase/12.12 Firebase/StudentViewController.swift delete mode 100644 12.12 Firebase/12.12 Firebase/ViewController.swift diff --git a/12.12 Firebase/12.12 Firebase.xcodeproj/project.pbxproj b/12.12 Firebase/12.12 Firebase.xcodeproj/project.pbxproj index a5822bb..fae2fdb 100644 --- a/12.12 Firebase/12.12 Firebase.xcodeproj/project.pbxproj +++ b/12.12 Firebase/12.12 Firebase.xcodeproj/project.pbxproj @@ -7,17 +7,29 @@ objects = { /* Begin PBXBuildFile section */ + 842532C821C1C09000152D91 /* StudentTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842532C721C1C09000152D91 /* StudentTableViewController.swift */; }; + 842532CA21C1C10E00152D91 /* StudentStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842532C921C1C10E00152D91 /* StudentStyle.swift */; }; + 842532CC21C1C17C00152D91 /* FirebaseItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842532CB21C1C17C00152D91 /* FirebaseItem.swift */; }; + 842532CE21C1C20000152D91 /* Firebase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842532CD21C1C20000152D91 /* Firebase.swift */; }; + 842532D021C1C24000152D91 /* StudentModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842532CF21C1C24000152D91 /* StudentModel.swift */; }; + 842532D221C1C26000152D91 /* Student.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842532D121C1C26000152D91 /* Student.swift */; }; + 842532D421C1CB9700152D91 /* StudentViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842532D321C1CB9700152D91 /* StudentViewController.swift */; }; 84F4406621C1BD6C00DB30A9 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84F4406521C1BD6C00DB30A9 /* AppDelegate.swift */; }; - 84F4406821C1BD6C00DB30A9 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84F4406721C1BD6C00DB30A9 /* ViewController.swift */; }; 84F4406B21C1BD6C00DB30A9 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 84F4406921C1BD6C00DB30A9 /* Main.storyboard */; }; 84F4406D21C1BD6D00DB30A9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 84F4406C21C1BD6D00DB30A9 /* Assets.xcassets */; }; 84F4407021C1BD6D00DB30A9 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 84F4406E21C1BD6D00DB30A9 /* LaunchScreen.storyboard */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 842532C721C1C09000152D91 /* StudentTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StudentTableViewController.swift; sourceTree = ""; }; + 842532C921C1C10E00152D91 /* StudentStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StudentStyle.swift; sourceTree = ""; }; + 842532CB21C1C17C00152D91 /* FirebaseItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirebaseItem.swift; sourceTree = ""; }; + 842532CD21C1C20000152D91 /* Firebase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Firebase.swift; sourceTree = ""; }; + 842532CF21C1C24000152D91 /* StudentModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StudentModel.swift; sourceTree = ""; }; + 842532D121C1C26000152D91 /* Student.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Student.swift; sourceTree = ""; }; + 842532D321C1CB9700152D91 /* StudentViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StudentViewController.swift; sourceTree = ""; }; 84F4406221C1BD6C00DB30A9 /* 12.12 Firebase.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "12.12 Firebase.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 84F4406521C1BD6C00DB30A9 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 84F4406721C1BD6C00DB30A9 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 84F4406A21C1BD6C00DB30A9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 84F4406C21C1BD6D00DB30A9 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 84F4406F21C1BD6D00DB30A9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; @@ -54,9 +66,15 @@ 84F4406421C1BD6C00DB30A9 /* 12.12 Firebase */ = { isa = PBXGroup; children = ( + 842532D121C1C26000152D91 /* Student.swift */, + 842532C721C1C09000152D91 /* StudentTableViewController.swift */, 84F4406521C1BD6C00DB30A9 /* AppDelegate.swift */, - 84F4406721C1BD6C00DB30A9 /* ViewController.swift */, 84F4406921C1BD6C00DB30A9 /* Main.storyboard */, + 842532D321C1CB9700152D91 /* StudentViewController.swift */, + 842532C921C1C10E00152D91 /* StudentStyle.swift */, + 842532CB21C1C17C00152D91 /* FirebaseItem.swift */, + 842532CD21C1C20000152D91 /* Firebase.swift */, + 842532CF21C1C24000152D91 /* StudentModel.swift */, 84F4406C21C1BD6D00DB30A9 /* Assets.xcassets */, 84F4406E21C1BD6D00DB30A9 /* LaunchScreen.storyboard */, 84F4407121C1BD6D00DB30A9 /* Info.plist */, @@ -135,8 +153,14 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 84F4406821C1BD6C00DB30A9 /* ViewController.swift in Sources */, + 842532D021C1C24000152D91 /* StudentModel.swift in Sources */, + 842532CE21C1C20000152D91 /* Firebase.swift in Sources */, + 842532CC21C1C17C00152D91 /* FirebaseItem.swift in Sources */, + 842532CA21C1C10E00152D91 /* StudentStyle.swift in Sources */, + 842532D421C1CB9700152D91 /* StudentViewController.swift in Sources */, 84F4406621C1BD6C00DB30A9 /* AppDelegate.swift in Sources */, + 842532C821C1C09000152D91 /* StudentTableViewController.swift in Sources */, + 842532D221C1C26000152D91 /* Student.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/12.12 Firebase/12.12 Firebase.xcodeproj/project.xcworkspace/xcuserdata/lambda_school_loaner_18.xcuserdatad/UserInterfaceState.xcuserstate b/12.12 Firebase/12.12 Firebase.xcodeproj/project.xcworkspace/xcuserdata/lambda_school_loaner_18.xcuserdatad/UserInterfaceState.xcuserstate index 4be5647d4bd14cb63257d17d5682d35895abcc26..16de73811d4b2c5580449d6b0021de8e83e8adfb 100644 GIT binary patch literal 28103 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 diff --git a/12.12 Firebase/12.12 Firebase/Base.lproj/Main.storyboard b/12.12 Firebase/12.12 Firebase/Base.lproj/Main.storyboard index fe4d2f3..7b8493d 100644 --- a/12.12 Firebase/12.12 Firebase/Base.lproj/Main.storyboard +++ b/12.12 Firebase/12.12 Firebase/Base.lproj/Main.storyboard @@ -6,13 +6,14 @@ + - + @@ -49,12 +50,65 @@ - + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/12.12 Firebase/12.12 Firebase/Firebase.swift b/12.12 Firebase/12.12 Firebase/Firebase.swift new file mode 100644 index 0000000..0628387 --- /dev/null +++ b/12.12 Firebase/12.12 Firebase/Firebase.swift @@ -0,0 +1,121 @@ +import Foundation + +class Firebase { + static var baseURL: URL! { return URL(string: "https://fir-app-aeb1c.firebaseio.com/") } + + static func requestURL(_ method: String, for recordIdentifier: String = "unknownid") -> URL { + switch method { + case "POST": + // posting to the main data base and returns a new record identifier + return baseURL.appendingPathExtension("json") + case "DELETE", "PUT", "GET": + // THESE WORK ON INdivual records, so u need to put record identifier in URL + return baseURL.appendingPathComponent(recordIdentifier).appendingPathExtension("json") + default: + fatalError("unknown request method: \(method)") + } + } + + static func processRequest(method: String, for item: Item, with completion: @escaping (_ success: Bool) -> Void = { _ in }) { + // get URL requets + var request = URLRequest(url: requestURL(method, for: item.recordIdentifier)) + request.httpMethod = method + + // Encode data -- do try catch block + do { + request.httpBody = try JSONEncoder().encode(item) + } catch { + NSLog("Unable to encode \(item): \(error)") + completion(false) + return + } + + let dataTask = URLSession.shared.dataTask(with: request) { (data, _, error) in + + //check for error + if let error = error { + NSLog("server \(method) error: \(error)") + completion(false) + return + } + + // Handle PUT, GET, DELETE + guard method == "POST" else { + completion(true) + return + } + + // process the POST request + // fetch identifier from POST + guard let data = data else { + NSLog("Invalid server response data") + completion(false) + return + } + + // decode - with another do\, try catch block + // POST request returns '["name: recordIdentifier]'. store the identifier + + + do { + let nameDict = try JSONDecoder().decode([String: String].self, from: data) + guard let recordIdentifier = nameDict["name"] else { + completion(false) + return + } + // if we do have record identifeier we update it here + item.recordIdentifier = recordIdentifier + processRequest(method: "PUT", for: item) + completion(true) + + } catch { + NSLog("Error decoding JSON response: \(error)") + completion(false) + return + } + } + dataTask.resume() + } + + static func delete(item: Item, completion: @escaping (_ success: Bool) -> Void = { _ in }) { + processRequest(method: "DELETE", for: item, with: completion) + } + + static func save(item: Item, completion: @escaping (_ success: Bool) -> Void = { _ in }) { + // check for record identifier + switch item.recordIdentifier.isEmpty { + case true: // new record --POST + processRequest(method: "POST", for: item, with: completion) + case false: // existing record, PUT + processRequest(method: "PUT", for: item, with: completion) + } + } + + static func fetchRecords(completion: @escaping ([Item]?) -> Void) { + let requestURL = baseURL.appendingPathExtension("json") + let dataTask = URLSession.shared.dataTask(with: requestURL) { (data, _, error) in + guard error == nil, let data = data else { + if let error = error { + NSLog("Error fetching entries: \(error)") + } + completion(nil) + return + } + + // decode data -- do, try catch block + do { + // double checking infrom recieved is right + let recordDict = try JSONDecoder().decode([String: Item].self, from: data) + for (key, value) in recordDict { + value.recordIdentifier = key + } + let records = recordDict.map { $0.value} + completion(records) + } catch { + NSLog("Error decoding recieved data: \(error)") + completion([]) + } + } + dataTask.resume() + } +} diff --git a/12.12 Firebase/12.12 Firebase/FirebaseItem.swift b/12.12 Firebase/12.12 Firebase/FirebaseItem.swift new file mode 100644 index 0000000..f8d7b15 --- /dev/null +++ b/12.12 Firebase/12.12 Firebase/FirebaseItem.swift @@ -0,0 +1,5 @@ +import Foundation + +protocol FirebaseItem: class { + var recordIdentifier: String { get set } +} diff --git a/12.12 Firebase/12.12 Firebase/Student.swift b/12.12 Firebase/12.12 Firebase/Student.swift new file mode 100644 index 0000000..0888f95 --- /dev/null +++ b/12.12 Firebase/12.12 Firebase/Student.swift @@ -0,0 +1,8 @@ +import Foundation + +class Student { + static let shared = Student() + private init() {} + + var students: [StudentStyle] = [] +} diff --git a/12.12 Firebase/12.12 Firebase/StudentModel.swift b/12.12 Firebase/12.12 Firebase/StudentModel.swift new file mode 100644 index 0000000..bd28d19 --- /dev/null +++ b/12.12 Firebase/12.12 Firebase/StudentModel.swift @@ -0,0 +1,51 @@ +import Foundation + +class StudentModel { + static let shared = StudentModel() + private init() {} + + private var students: [Student] = [] + + var numberOfStudents: Int { + return students.count + } + + func student(at indexPath: IndexPath) -> Student { + return students[indexPath.row] + } + + func setStudents(_ students: [Student]) { + self.students = students + + } + + func addNewStudent(completion: @escaping () -> Void ) { + let student = StudentViewController.nameLabel.text + students.append(student) + Firebase.save(item: student) { _ in + DispatchQueue.main.async { + completion() + } + } + } + + func delete(at indexPath: IndexPath, completion: @escaping () -> Void ) { + let student = students.remove(at: indexPath.row) + //delet from database + Firebase.delete(item: student) { _ in + DispatchQueue.main.async { + completion() + } + } + } + + func updateDevice(at indexPath: IndexPath, completion: @escaping () -> Void ) { + let student = students[indexPath.row] + + Firebase.save(item: student) { _ in + DispatchQueue.main.async { + completion() + } + } + } +} diff --git a/12.12 Firebase/12.12 Firebase/StudentStyle.swift b/12.12 Firebase/12.12 Firebase/StudentStyle.swift new file mode 100644 index 0000000..8fc8d59 --- /dev/null +++ b/12.12 Firebase/12.12 Firebase/StudentStyle.swift @@ -0,0 +1,10 @@ +import Foundation + +struct StudentStyle: Codable { + + static let shared = StudentStyle() + private init() {} + + let name: String + let phoneNumber: String +} diff --git a/12.12 Firebase/12.12 Firebase/StudentTableViewController.swift b/12.12 Firebase/12.12 Firebase/StudentTableViewController.swift new file mode 100644 index 0000000..18d331c --- /dev/null +++ b/12.12 Firebase/12.12 Firebase/StudentTableViewController.swift @@ -0,0 +1,29 @@ +import UIKit + +class StudentTableViewController: UITableViewController { + + let reuseIdentifier = "cell" + + override func viewDidLoad() { + super.viewDidLoad() + + } + + // MARK: - Table view data source + + + + override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + // #warning Incomplete implementation, return the number of rows + return 0 + } + + + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier, for: indexPath) + + + + return cell + } +} diff --git a/12.12 Firebase/12.12 Firebase/StudentViewController.swift b/12.12 Firebase/12.12 Firebase/StudentViewController.swift new file mode 100644 index 0000000..ef9afdd --- /dev/null +++ b/12.12 Firebase/12.12 Firebase/StudentViewController.swift @@ -0,0 +1,13 @@ +import UIKit + +class StudentViewController: UIViewController { + + @IBOutlet weak var nameLabel: UITextField! + @IBOutlet weak var phoneLabel: UITextField! + + @IBAction func addButton(_ sender: Any) { + guard let text = nameLabel.text, !text.isEmpty else { return } + StudentModel.shared. + } + +} diff --git a/12.12 Firebase/12.12 Firebase/ViewController.swift b/12.12 Firebase/12.12 Firebase/ViewController.swift deleted file mode 100644 index 72467d4..0000000 --- a/12.12 Firebase/12.12 Firebase/ViewController.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// ViewController.swift -// 12.12 Firebase -// -// Created by Lambda_School_Loaner_18 on 12/12/18. -// Copyright © 2018 Lambda_School_Loaner_18. All rights reserved. -// - -import UIKit - -class ViewController: UIViewController { - - override func viewDidLoad() { - super.viewDidLoad() - // Do any additional setup after loading the view, typically from a nib. - } - - -} -