From 11ded5a5abd6685fa41fb6be72f18f8c778632ed Mon Sep 17 00:00:00 2001 From: Jovanny Espinal Date: Fri, 21 Aug 2015 18:23:45 -0400 Subject: [PATCH 01/79] Converted to Swift --- Stopwatch/Stopwatch.xcodeproj/project.pbxproj | 507 ++++++++++++++++++ .../contents.xcworkspacedata | 2 +- Stopwatch/Stopwatch/AppDelegate.swift | 46 ++ .../AppIcon.appiconset/Contents.json | 30 -- .../Base.lproj/LaunchScreen.storyboard | 27 + .../Stopwatch}/Base.lproj/Main.storyboard | 2 +- {Time/Time => Stopwatch/Stopwatch}/Info.plist | 9 +- Stopwatch/Stopwatch/ViewController.swift | 25 + .../StopwatchTests}/Info.plist | 2 +- Stopwatch/StopwatchTests/StopwatchTests.swift | 36 ++ Stopwatch/StopwatchUITests/Info.plist | 24 + .../StopwatchUITests/StopwatchUITests.swift | 34 ++ Time/Time.xcodeproj/project.pbxproj | 433 --------------- Time/Time/AppDelegate.h | 17 - Time/Time/AppDelegate.m | 45 -- Time/Time/Base.lproj/LaunchScreen.xib | 41 -- Time/Time/ViewController.h | 15 - Time/Time/ViewController.m | 27 - Time/Time/main.m | 16 - Time/TimeTests/TimeTests.m | 40 -- 20 files changed, 703 insertions(+), 675 deletions(-) create mode 100644 Stopwatch/Stopwatch.xcodeproj/project.pbxproj rename {Time/Time.xcodeproj => Stopwatch/Stopwatch.xcodeproj}/project.xcworkspace/contents.xcworkspacedata (70%) create mode 100644 Stopwatch/Stopwatch/AppDelegate.swift rename {Time/Time/Images.xcassets => Stopwatch/Stopwatch/Assets.xcassets}/AppIcon.appiconset/Contents.json (54%) create mode 100644 Stopwatch/Stopwatch/Base.lproj/LaunchScreen.storyboard rename {Time/Time => Stopwatch/Stopwatch}/Base.lproj/Main.storyboard (95%) rename {Time/Time => Stopwatch/Stopwatch}/Info.plist (76%) create mode 100644 Stopwatch/Stopwatch/ViewController.swift rename {Time/TimeTests => Stopwatch/StopwatchTests}/Info.plist (90%) create mode 100644 Stopwatch/StopwatchTests/StopwatchTests.swift create mode 100644 Stopwatch/StopwatchUITests/Info.plist create mode 100644 Stopwatch/StopwatchUITests/StopwatchUITests.swift delete mode 100644 Time/Time.xcodeproj/project.pbxproj delete mode 100644 Time/Time/AppDelegate.h delete mode 100644 Time/Time/AppDelegate.m delete mode 100644 Time/Time/Base.lproj/LaunchScreen.xib delete mode 100644 Time/Time/ViewController.h delete mode 100644 Time/Time/ViewController.m delete mode 100644 Time/Time/main.m delete mode 100644 Time/TimeTests/TimeTests.m diff --git a/Stopwatch/Stopwatch.xcodeproj/project.pbxproj b/Stopwatch/Stopwatch.xcodeproj/project.pbxproj new file mode 100644 index 0000000..2ffa285 --- /dev/null +++ b/Stopwatch/Stopwatch.xcodeproj/project.pbxproj @@ -0,0 +1,507 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 5028B52E1B87DC1F00CB0B34 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5028B52D1B87DC1F00CB0B34 /* AppDelegate.swift */; }; + 5028B5301B87DC1F00CB0B34 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5028B52F1B87DC1F00CB0B34 /* ViewController.swift */; }; + 5028B5331B87DC1F00CB0B34 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5028B5311B87DC1F00CB0B34 /* Main.storyboard */; }; + 5028B5351B87DC1F00CB0B34 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5028B5341B87DC1F00CB0B34 /* Assets.xcassets */; }; + 5028B5381B87DC1F00CB0B34 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5028B5361B87DC1F00CB0B34 /* LaunchScreen.storyboard */; }; + 5028B5431B87DC1F00CB0B34 /* StopwatchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5028B5421B87DC1F00CB0B34 /* StopwatchTests.swift */; }; + 5028B54E1B87DC2000CB0B34 /* StopwatchUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5028B54D1B87DC2000CB0B34 /* StopwatchUITests.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 5028B53F1B87DC1F00CB0B34 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 5028B5221B87DC1F00CB0B34 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 5028B5291B87DC1F00CB0B34; + remoteInfo = Stopwatch; + }; + 5028B54A1B87DC2000CB0B34 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 5028B5221B87DC1F00CB0B34 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 5028B5291B87DC1F00CB0B34; + remoteInfo = Stopwatch; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 5028B52A1B87DC1F00CB0B34 /* Stopwatch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Stopwatch.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 5028B52D1B87DC1F00CB0B34 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 5028B52F1B87DC1F00CB0B34 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 5028B5321B87DC1F00CB0B34 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 5028B5341B87DC1F00CB0B34 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 5028B5371B87DC1F00CB0B34 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 5028B5391B87DC1F00CB0B34 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 5028B53E1B87DC1F00CB0B34 /* StopwatchTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = StopwatchTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 5028B5421B87DC1F00CB0B34 /* StopwatchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StopwatchTests.swift; sourceTree = ""; }; + 5028B5441B87DC1F00CB0B34 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 5028B5491B87DC2000CB0B34 /* StopwatchUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = StopwatchUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 5028B54D1B87DC2000CB0B34 /* StopwatchUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StopwatchUITests.swift; sourceTree = ""; }; + 5028B54F1B87DC2000CB0B34 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 5028B5271B87DC1F00CB0B34 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5028B53B1B87DC1F00CB0B34 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5028B5461B87DC2000CB0B34 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 5028B5211B87DC1F00CB0B34 = { + isa = PBXGroup; + children = ( + 5028B52C1B87DC1F00CB0B34 /* Stopwatch */, + 5028B5411B87DC1F00CB0B34 /* StopwatchTests */, + 5028B54C1B87DC2000CB0B34 /* StopwatchUITests */, + 5028B52B1B87DC1F00CB0B34 /* Products */, + ); + sourceTree = ""; + }; + 5028B52B1B87DC1F00CB0B34 /* Products */ = { + isa = PBXGroup; + children = ( + 5028B52A1B87DC1F00CB0B34 /* Stopwatch.app */, + 5028B53E1B87DC1F00CB0B34 /* StopwatchTests.xctest */, + 5028B5491B87DC2000CB0B34 /* StopwatchUITests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 5028B52C1B87DC1F00CB0B34 /* Stopwatch */ = { + isa = PBXGroup; + children = ( + 5028B52D1B87DC1F00CB0B34 /* AppDelegate.swift */, + 5028B52F1B87DC1F00CB0B34 /* ViewController.swift */, + 5028B5311B87DC1F00CB0B34 /* Main.storyboard */, + 5028B5341B87DC1F00CB0B34 /* Assets.xcassets */, + 5028B5361B87DC1F00CB0B34 /* LaunchScreen.storyboard */, + 5028B5391B87DC1F00CB0B34 /* Info.plist */, + ); + path = Stopwatch; + sourceTree = ""; + }; + 5028B5411B87DC1F00CB0B34 /* StopwatchTests */ = { + isa = PBXGroup; + children = ( + 5028B5421B87DC1F00CB0B34 /* StopwatchTests.swift */, + 5028B5441B87DC1F00CB0B34 /* Info.plist */, + ); + path = StopwatchTests; + sourceTree = ""; + }; + 5028B54C1B87DC2000CB0B34 /* StopwatchUITests */ = { + isa = PBXGroup; + children = ( + 5028B54D1B87DC2000CB0B34 /* StopwatchUITests.swift */, + 5028B54F1B87DC2000CB0B34 /* Info.plist */, + ); + path = StopwatchUITests; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 5028B5291B87DC1F00CB0B34 /* Stopwatch */ = { + isa = PBXNativeTarget; + buildConfigurationList = 5028B5521B87DC2000CB0B34 /* Build configuration list for PBXNativeTarget "Stopwatch" */; + buildPhases = ( + 5028B5261B87DC1F00CB0B34 /* Sources */, + 5028B5271B87DC1F00CB0B34 /* Frameworks */, + 5028B5281B87DC1F00CB0B34 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Stopwatch; + productName = Stopwatch; + productReference = 5028B52A1B87DC1F00CB0B34 /* Stopwatch.app */; + productType = "com.apple.product-type.application"; + }; + 5028B53D1B87DC1F00CB0B34 /* StopwatchTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 5028B5551B87DC2000CB0B34 /* Build configuration list for PBXNativeTarget "StopwatchTests" */; + buildPhases = ( + 5028B53A1B87DC1F00CB0B34 /* Sources */, + 5028B53B1B87DC1F00CB0B34 /* Frameworks */, + 5028B53C1B87DC1F00CB0B34 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 5028B5401B87DC1F00CB0B34 /* PBXTargetDependency */, + ); + name = StopwatchTests; + productName = StopwatchTests; + productReference = 5028B53E1B87DC1F00CB0B34 /* StopwatchTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 5028B5481B87DC2000CB0B34 /* StopwatchUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 5028B5581B87DC2000CB0B34 /* Build configuration list for PBXNativeTarget "StopwatchUITests" */; + buildPhases = ( + 5028B5451B87DC2000CB0B34 /* Sources */, + 5028B5461B87DC2000CB0B34 /* Frameworks */, + 5028B5471B87DC2000CB0B34 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 5028B54B1B87DC2000CB0B34 /* PBXTargetDependency */, + ); + name = StopwatchUITests; + productName = StopwatchUITests; + productReference = 5028B5491B87DC2000CB0B34 /* StopwatchUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 5028B5221B87DC1F00CB0B34 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0700; + ORGANIZATIONNAME = "Jovanny Espinal"; + TargetAttributes = { + 5028B5291B87DC1F00CB0B34 = { + CreatedOnToolsVersion = 7.0; + DevelopmentTeam = B4G65K7YME; + }; + 5028B53D1B87DC1F00CB0B34 = { + CreatedOnToolsVersion = 7.0; + DevelopmentTeam = B4G65K7YME; + TestTargetID = 5028B5291B87DC1F00CB0B34; + }; + 5028B5481B87DC2000CB0B34 = { + CreatedOnToolsVersion = 7.0; + DevelopmentTeam = B4G65K7YME; + TestTargetID = 5028B5291B87DC1F00CB0B34; + }; + }; + }; + buildConfigurationList = 5028B5251B87DC1F00CB0B34 /* Build configuration list for PBXProject "Stopwatch" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 5028B5211B87DC1F00CB0B34; + productRefGroup = 5028B52B1B87DC1F00CB0B34 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 5028B5291B87DC1F00CB0B34 /* Stopwatch */, + 5028B53D1B87DC1F00CB0B34 /* StopwatchTests */, + 5028B5481B87DC2000CB0B34 /* StopwatchUITests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 5028B5281B87DC1F00CB0B34 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5028B5381B87DC1F00CB0B34 /* LaunchScreen.storyboard in Resources */, + 5028B5351B87DC1F00CB0B34 /* Assets.xcassets in Resources */, + 5028B5331B87DC1F00CB0B34 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5028B53C1B87DC1F00CB0B34 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5028B5471B87DC2000CB0B34 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 5028B5261B87DC1F00CB0B34 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5028B5301B87DC1F00CB0B34 /* ViewController.swift in Sources */, + 5028B52E1B87DC1F00CB0B34 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5028B53A1B87DC1F00CB0B34 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5028B5431B87DC1F00CB0B34 /* StopwatchTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5028B5451B87DC2000CB0B34 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5028B54E1B87DC2000CB0B34 /* StopwatchUITests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 5028B5401B87DC1F00CB0B34 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 5028B5291B87DC1F00CB0B34 /* Stopwatch */; + targetProxy = 5028B53F1B87DC1F00CB0B34 /* PBXContainerItemProxy */; + }; + 5028B54B1B87DC2000CB0B34 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 5028B5291B87DC1F00CB0B34 /* Stopwatch */; + targetProxy = 5028B54A1B87DC2000CB0B34 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 5028B5311B87DC1F00CB0B34 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 5028B5321B87DC1F00CB0B34 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 5028B5361B87DC1F00CB0B34 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 5028B5371B87DC1F00CB0B34 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 5028B5501B87DC2000CB0B34 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + 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 = 9.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 5028B5511B87DC2000CB0B34 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "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 = gnu99; + 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 = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 5028B5531B87DC2000CB0B34 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = Stopwatch/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = jovannyespinal.Stopwatch; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 5028B5541B87DC2000CB0B34 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = Stopwatch/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = jovannyespinal.Stopwatch; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 5028B5561B87DC2000CB0B34 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + INFOPLIST_FILE = StopwatchTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = jovannyespinal.StopwatchTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Stopwatch.app/Stopwatch"; + }; + name = Debug; + }; + 5028B5571B87DC2000CB0B34 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + INFOPLIST_FILE = StopwatchTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = jovannyespinal.StopwatchTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Stopwatch.app/Stopwatch"; + }; + name = Release; + }; + 5028B5591B87DC2000CB0B34 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = StopwatchUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = jovannyespinal.StopwatchUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_TARGET_NAME = Stopwatch; + USES_XCTRUNNER = YES; + }; + name = Debug; + }; + 5028B55A1B87DC2000CB0B34 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = StopwatchUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = jovannyespinal.StopwatchUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_TARGET_NAME = Stopwatch; + USES_XCTRUNNER = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 5028B5251B87DC1F00CB0B34 /* Build configuration list for PBXProject "Stopwatch" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5028B5501B87DC2000CB0B34 /* Debug */, + 5028B5511B87DC2000CB0B34 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 5028B5521B87DC2000CB0B34 /* Build configuration list for PBXNativeTarget "Stopwatch" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5028B5531B87DC2000CB0B34 /* Debug */, + 5028B5541B87DC2000CB0B34 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; + 5028B5551B87DC2000CB0B34 /* Build configuration list for PBXNativeTarget "StopwatchTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5028B5561B87DC2000CB0B34 /* Debug */, + 5028B5571B87DC2000CB0B34 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; + 5028B5581B87DC2000CB0B34 /* Build configuration list for PBXNativeTarget "StopwatchUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5028B5591B87DC2000CB0B34 /* Debug */, + 5028B55A1B87DC2000CB0B34 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; +/* End XCConfigurationList section */ + }; + rootObject = 5028B5221B87DC1F00CB0B34 /* Project object */; +} diff --git a/Time/Time.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Stopwatch/Stopwatch.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 70% rename from Time/Time.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to Stopwatch/Stopwatch.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 85e10aa..c935585 100644 --- a/Time/Time.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/Stopwatch/Stopwatch.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:Stopwatch.xcodeproj"> diff --git a/Stopwatch/Stopwatch/AppDelegate.swift b/Stopwatch/Stopwatch/AppDelegate.swift new file mode 100644 index 0000000..5871f1d --- /dev/null +++ b/Stopwatch/Stopwatch/AppDelegate.swift @@ -0,0 +1,46 @@ +// +// AppDelegate.swift +// Stopwatch +// +// Created by Jovanny Espinal on 8/21/15. +// Copyright © 2015 Jovanny Espinal. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + + func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { + // Override point for customization after application launch. + return true + } + + func applicationWillResignActive(application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(application: UIApplication) { + // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + +} + diff --git a/Time/Time/Images.xcassets/AppIcon.appiconset/Contents.json b/Stopwatch/Stopwatch/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 54% rename from Time/Time/Images.xcassets/AppIcon.appiconset/Contents.json rename to Stopwatch/Stopwatch/Assets.xcassets/AppIcon.appiconset/Contents.json index 36d2c80..118c98f 100644 --- a/Time/Time/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/Stopwatch/Stopwatch/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -29,36 +29,6 @@ "idiom" : "iphone", "size" : "60x60", "scale" : "3x" - }, - { - "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" } ], "info" : { diff --git a/Stopwatch/Stopwatch/Base.lproj/LaunchScreen.storyboard b/Stopwatch/Stopwatch/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..2e721e1 --- /dev/null +++ b/Stopwatch/Stopwatch/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Time/Time/Base.lproj/Main.storyboard b/Stopwatch/Stopwatch/Base.lproj/Main.storyboard similarity index 95% rename from Time/Time/Base.lproj/Main.storyboard rename to Stopwatch/Stopwatch/Base.lproj/Main.storyboard index f56d2f3..3a2a49b 100644 --- a/Time/Time/Base.lproj/Main.storyboard +++ b/Stopwatch/Stopwatch/Base.lproj/Main.storyboard @@ -7,7 +7,7 @@ - + diff --git a/Time/Time/Info.plist b/Stopwatch/Stopwatch/Info.plist similarity index 76% rename from Time/Time/Info.plist rename to Stopwatch/Stopwatch/Info.plist index 62e151f..6905cc6 100644 --- a/Time/Time/Info.plist +++ b/Stopwatch/Stopwatch/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.mikekavouras.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -36,12 +36,5 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - diff --git a/Stopwatch/Stopwatch/ViewController.swift b/Stopwatch/Stopwatch/ViewController.swift new file mode 100644 index 0000000..d0f4340 --- /dev/null +++ b/Stopwatch/Stopwatch/ViewController.swift @@ -0,0 +1,25 @@ +// +// ViewController.swift +// Stopwatch +// +// Created by Jovanny Espinal on 8/21/15. +// Copyright © 2015 Jovanny Espinal. 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. + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + +} + diff --git a/Time/TimeTests/Info.plist b/Stopwatch/StopwatchTests/Info.plist similarity index 90% rename from Time/TimeTests/Info.plist rename to Stopwatch/StopwatchTests/Info.plist index 54624a4..ba72822 100644 --- a/Time/TimeTests/Info.plist +++ b/Stopwatch/StopwatchTests/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.mikekavouras.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/Stopwatch/StopwatchTests/StopwatchTests.swift b/Stopwatch/StopwatchTests/StopwatchTests.swift new file mode 100644 index 0000000..711ef04 --- /dev/null +++ b/Stopwatch/StopwatchTests/StopwatchTests.swift @@ -0,0 +1,36 @@ +// +// StopwatchTests.swift +// StopwatchTests +// +// Created by Jovanny Espinal on 8/21/15. +// Copyright © 2015 Jovanny Espinal. All rights reserved. +// + +import XCTest +@testable import Stopwatch + +class StopwatchTests: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testPerformanceExample() { + // This is an example of a performance test case. + self.measureBlock { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/Stopwatch/StopwatchUITests/Info.plist b/Stopwatch/StopwatchUITests/Info.plist new file mode 100644 index 0000000..ba72822 --- /dev/null +++ b/Stopwatch/StopwatchUITests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/Stopwatch/StopwatchUITests/StopwatchUITests.swift b/Stopwatch/StopwatchUITests/StopwatchUITests.swift new file mode 100644 index 0000000..92687ff --- /dev/null +++ b/Stopwatch/StopwatchUITests/StopwatchUITests.swift @@ -0,0 +1,34 @@ +// +// StopwatchUITests.swift +// StopwatchUITests +// +// Created by Jovanny Espinal on 8/21/15. +// Copyright © 2015 Jovanny Espinal. All rights reserved. +// + +import XCTest + +class StopwatchUITests: XCTestCase { + + override func setUp() { + super.setUp() + + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. + XCUIApplication().launch() + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // Use recording to get started writing UI tests. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + +} diff --git a/Time/Time.xcodeproj/project.pbxproj b/Time/Time.xcodeproj/project.pbxproj deleted file mode 100644 index c8743f0..0000000 --- a/Time/Time.xcodeproj/project.pbxproj +++ /dev/null @@ -1,433 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 8D05375E1B86687C00588318 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D05375D1B86687C00588318 /* main.m */; }; - 8D0537611B86687C00588318 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D0537601B86687C00588318 /* AppDelegate.m */; }; - 8D0537641B86687C00588318 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D0537631B86687C00588318 /* ViewController.m */; }; - 8D0537671B86687C00588318 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8D0537651B86687C00588318 /* Main.storyboard */; }; - 8D0537691B86687C00588318 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8D0537681B86687C00588318 /* Images.xcassets */; }; - 8D05376C1B86687C00588318 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8D05376A1B86687C00588318 /* LaunchScreen.xib */; }; - 8D0537781B86687C00588318 /* TimeTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D0537771B86687C00588318 /* TimeTests.m */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 8D0537721B86687C00588318 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 8D0537501B86687B00588318 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 8D0537571B86687B00588318; - remoteInfo = Time; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 8D0537581B86687B00588318 /* Time.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Time.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 8D05375C1B86687B00588318 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 8D05375D1B86687C00588318 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 8D05375F1B86687C00588318 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; - 8D0537601B86687C00588318 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; - 8D0537621B86687C00588318 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; - 8D0537631B86687C00588318 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; - 8D0537661B86687C00588318 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 8D0537681B86687C00588318 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; - 8D05376B1B86687C00588318 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; - 8D0537711B86687C00588318 /* TimeTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TimeTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 8D0537761B86687C00588318 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 8D0537771B86687C00588318 /* TimeTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TimeTests.m; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 8D0537551B86687B00588318 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8D05376E1B86687C00588318 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 8D05374F1B86687B00588318 = { - isa = PBXGroup; - children = ( - 8D05375A1B86687B00588318 /* Time */, - 8D0537741B86687C00588318 /* TimeTests */, - 8D0537591B86687B00588318 /* Products */, - ); - sourceTree = ""; - }; - 8D0537591B86687B00588318 /* Products */ = { - isa = PBXGroup; - children = ( - 8D0537581B86687B00588318 /* Time.app */, - 8D0537711B86687C00588318 /* TimeTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 8D05375A1B86687B00588318 /* Time */ = { - isa = PBXGroup; - children = ( - 8D05375F1B86687C00588318 /* AppDelegate.h */, - 8D0537601B86687C00588318 /* AppDelegate.m */, - 8D0537621B86687C00588318 /* ViewController.h */, - 8D0537631B86687C00588318 /* ViewController.m */, - 8D0537651B86687C00588318 /* Main.storyboard */, - 8D0537681B86687C00588318 /* Images.xcassets */, - 8D05376A1B86687C00588318 /* LaunchScreen.xib */, - 8D05375B1B86687B00588318 /* Supporting Files */, - ); - path = Time; - sourceTree = ""; - }; - 8D05375B1B86687B00588318 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 8D05375C1B86687B00588318 /* Info.plist */, - 8D05375D1B86687C00588318 /* main.m */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 8D0537741B86687C00588318 /* TimeTests */ = { - isa = PBXGroup; - children = ( - 8D0537771B86687C00588318 /* TimeTests.m */, - 8D0537751B86687C00588318 /* Supporting Files */, - ); - path = TimeTests; - sourceTree = ""; - }; - 8D0537751B86687C00588318 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 8D0537761B86687C00588318 /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 8D0537571B86687B00588318 /* Time */ = { - isa = PBXNativeTarget; - buildConfigurationList = 8D05377B1B86687C00588318 /* Build configuration list for PBXNativeTarget "Time" */; - buildPhases = ( - 8D0537541B86687B00588318 /* Sources */, - 8D0537551B86687B00588318 /* Frameworks */, - 8D0537561B86687B00588318 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Time; - productName = Time; - productReference = 8D0537581B86687B00588318 /* Time.app */; - productType = "com.apple.product-type.application"; - }; - 8D0537701B86687C00588318 /* TimeTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 8D05377E1B86687C00588318 /* Build configuration list for PBXNativeTarget "TimeTests" */; - buildPhases = ( - 8D05376D1B86687C00588318 /* Sources */, - 8D05376E1B86687C00588318 /* Frameworks */, - 8D05376F1B86687C00588318 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 8D0537731B86687C00588318 /* PBXTargetDependency */, - ); - name = TimeTests; - productName = TimeTests; - productReference = 8D0537711B86687C00588318 /* TimeTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 8D0537501B86687B00588318 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0640; - ORGANIZATIONNAME = "Mike Kavouras"; - TargetAttributes = { - 8D0537571B86687B00588318 = { - CreatedOnToolsVersion = 6.4; - }; - 8D0537701B86687C00588318 = { - CreatedOnToolsVersion = 6.4; - TestTargetID = 8D0537571B86687B00588318; - }; - }; - }; - buildConfigurationList = 8D0537531B86687B00588318 /* Build configuration list for PBXProject "Time" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 8D05374F1B86687B00588318; - productRefGroup = 8D0537591B86687B00588318 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 8D0537571B86687B00588318 /* Time */, - 8D0537701B86687C00588318 /* TimeTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 8D0537561B86687B00588318 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8D0537671B86687C00588318 /* Main.storyboard in Resources */, - 8D05376C1B86687C00588318 /* LaunchScreen.xib in Resources */, - 8D0537691B86687C00588318 /* Images.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8D05376F1B86687C00588318 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 8D0537541B86687B00588318 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8D0537641B86687C00588318 /* ViewController.m in Sources */, - 8D0537611B86687C00588318 /* AppDelegate.m in Sources */, - 8D05375E1B86687C00588318 /* main.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8D05376D1B86687C00588318 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8D0537781B86687C00588318 /* TimeTests.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 8D0537731B86687C00588318 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 8D0537571B86687B00588318 /* Time */; - targetProxy = 8D0537721B86687C00588318 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 8D0537651B86687C00588318 /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 8D0537661B86687C00588318 /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 8D05376A1B86687C00588318 /* LaunchScreen.xib */ = { - isa = PBXVariantGroup; - children = ( - 8D05376B1B86687C00588318 /* Base */, - ); - name = LaunchScreen.xib; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 8D0537791B86687C00588318 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - 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 = 8.4; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 8D05377A1B86687C00588318 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "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 = gnu99; - 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 = 8.4; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 8D05377C1B86687C00588318 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - INFOPLIST_FILE = Time/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 8D05377D1B86687C00588318 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - INFOPLIST_FILE = Time/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; - 8D05377F1B86687C00588318 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = TimeTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Time.app/Time"; - }; - name = Debug; - }; - 8D0537801B86687C00588318 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); - INFOPLIST_FILE = TimeTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Time.app/Time"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 8D0537531B86687B00588318 /* Build configuration list for PBXProject "Time" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 8D0537791B86687C00588318 /* Debug */, - 8D05377A1B86687C00588318 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 8D05377B1B86687C00588318 /* Build configuration list for PBXNativeTarget "Time" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 8D05377C1B86687C00588318 /* Debug */, - 8D05377D1B86687C00588318 /* Release */, - ); - defaultConfigurationIsVisible = 0; - }; - 8D05377E1B86687C00588318 /* Build configuration list for PBXNativeTarget "TimeTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 8D05377F1B86687C00588318 /* Debug */, - 8D0537801B86687C00588318 /* Release */, - ); - defaultConfigurationIsVisible = 0; - }; -/* End XCConfigurationList section */ - }; - rootObject = 8D0537501B86687B00588318 /* Project object */; -} diff --git a/Time/Time/AppDelegate.h b/Time/Time/AppDelegate.h deleted file mode 100644 index c5a324b..0000000 --- a/Time/Time/AppDelegate.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// AppDelegate.h -// Time -// -// Created by Michael Kavouras on 8/20/15. -// Copyright (c) 2015 Mike Kavouras. All rights reserved. -// - -#import - -@interface AppDelegate : UIResponder - -@property (strong, nonatomic) UIWindow *window; - - -@end - diff --git a/Time/Time/AppDelegate.m b/Time/Time/AppDelegate.m deleted file mode 100644 index d59e7a8..0000000 --- a/Time/Time/AppDelegate.m +++ /dev/null @@ -1,45 +0,0 @@ -// -// AppDelegate.m -// Time -// -// Created by Michael Kavouras on 8/20/15. -// Copyright (c) 2015 Mike Kavouras. All rights reserved. -// - -#import "AppDelegate.h" - -@interface AppDelegate () - -@end - -@implementation AppDelegate - - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - // Override point for customization after application launch. - return YES; -} - -- (void)applicationWillResignActive:(UIApplication *)application { - // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. -} - -- (void)applicationDidEnterBackground:(UIApplication *)application { - // 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. -} - -- (void)applicationWillEnterForeground:(UIApplication *)application { - // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. -} - -- (void)applicationDidBecomeActive:(UIApplication *)application { - // 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. -} - -- (void)applicationWillTerminate:(UIApplication *)application { - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. -} - -@end diff --git a/Time/Time/Base.lproj/LaunchScreen.xib b/Time/Time/Base.lproj/LaunchScreen.xib deleted file mode 100644 index f9a54ff..0000000 --- a/Time/Time/Base.lproj/LaunchScreen.xib +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Time/Time/ViewController.h b/Time/Time/ViewController.h deleted file mode 100644 index 9d0e38f..0000000 --- a/Time/Time/ViewController.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// ViewController.h -// Time -// -// Created by Michael Kavouras on 8/20/15. -// Copyright (c) 2015 Mike Kavouras. All rights reserved. -// - -#import - -@interface ViewController : UIViewController - - -@end - diff --git a/Time/Time/ViewController.m b/Time/Time/ViewController.m deleted file mode 100644 index 194fe5f..0000000 --- a/Time/Time/ViewController.m +++ /dev/null @@ -1,27 +0,0 @@ -// -// ViewController.m -// Time -// -// Created by Michael Kavouras on 8/20/15. -// Copyright (c) 2015 Mike Kavouras. All rights reserved. -// - -#import "ViewController.h" - -@interface ViewController () - -@end - -@implementation ViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - // Do any additional setup after loading the view, typically from a nib. -} - -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} - -@end diff --git a/Time/Time/main.m b/Time/Time/main.m deleted file mode 100644 index 9583fe1..0000000 --- a/Time/Time/main.m +++ /dev/null @@ -1,16 +0,0 @@ -// -// main.m -// Time -// -// Created by Michael Kavouras on 8/20/15. -// Copyright (c) 2015 Mike Kavouras. All rights reserved. -// - -#import -#import "AppDelegate.h" - -int main(int argc, char * argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/Time/TimeTests/TimeTests.m b/Time/TimeTests/TimeTests.m deleted file mode 100644 index 944060f..0000000 --- a/Time/TimeTests/TimeTests.m +++ /dev/null @@ -1,40 +0,0 @@ -// -// TimeTests.m -// TimeTests -// -// Created by Michael Kavouras on 8/20/15. -// Copyright (c) 2015 Mike Kavouras. All rights reserved. -// - -#import -#import - -@interface TimeTests : XCTestCase - -@end - -@implementation TimeTests - -- (void)setUp { - [super setUp]; - // Put setup code here. This method is called before the invocation of each test method in the class. -} - -- (void)tearDown { - // Put teardown code here. This method is called after the invocation of each test method in the class. - [super tearDown]; -} - -- (void)testExample { - // This is an example of a functional test case. - XCTAssert(YES, @"Pass"); -} - -- (void)testPerformanceExample { - // This is an example of a performance test case. - [self measureBlock:^{ - // Put the code you want to measure the time of here. - }]; -} - -@end From 3405dc7fd7de83322b6b70bcae6589d287eeb1a8 Mon Sep 17 00:00:00 2001 From: Jovanny Espinal Date: Fri, 21 Aug 2015 19:17:20 -0400 Subject: [PATCH 02/79] Stopwatch Interface --- .../Stopwatch/Assets.xcassets/Contents.json | 6 + .../Stopwatch/Base.lproj/Main.storyboard | 132 +++++++++++++++++- Stopwatch/Stopwatch/ViewController.swift | 41 +++++- 3 files changed, 174 insertions(+), 5 deletions(-) create mode 100644 Stopwatch/Stopwatch/Assets.xcassets/Contents.json diff --git a/Stopwatch/Stopwatch/Assets.xcassets/Contents.json b/Stopwatch/Stopwatch/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/Stopwatch/Stopwatch/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Stopwatch/Stopwatch/Base.lproj/Main.storyboard b/Stopwatch/Stopwatch/Base.lproj/Main.storyboard index 3a2a49b..dab7d4c 100644 --- a/Stopwatch/Stopwatch/Base.lproj/Main.storyboard +++ b/Stopwatch/Stopwatch/Base.lproj/Main.storyboard @@ -1,13 +1,19 @@ - + - + + + + + HelveticaNeue + + - + @@ -15,11 +21,129 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Stopwatch/Stopwatch/ViewController.swift b/Stopwatch/Stopwatch/ViewController.swift index d0f4340..bb34a09 100644 --- a/Stopwatch/Stopwatch/ViewController.swift +++ b/Stopwatch/Stopwatch/ViewController.swift @@ -8,7 +8,15 @@ import UIKit -class ViewController: UIViewController { +class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { + + @IBOutlet weak var stopwatchLabel: UILabel! + + @IBOutlet weak var lapsTableView: UITableView! + + @IBOutlet weak var startStopButton: UIButton! + + @IBOutlet weak var lapsResetButton: UIButton! override func viewDidLoad() { super.viewDidLoad() @@ -20,6 +28,37 @@ class ViewController: UIViewController { // Dispose of any resources that can be recreated. } + @IBAction func startStop(sender: AnyObject) { + + } + + @IBAction func lapsReset(sender: AnyObject) { + + } + + //TableView Methods + + func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + + let cell = UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: "Cell") + + cell.backgroundColor = self.view.backgroundColor + + + cell.textLabel!.text = "Lap" + + cell.detailTextLabel?.text = "00:00:00" + + return cell + + } + + func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return 3 + } + + } + From b555ff364803c28a802ef21193772f3f7f2e8d28 Mon Sep 17 00:00:00 2001 From: Jovanny Espinal Date: Fri, 21 Aug 2015 19:19:01 -0400 Subject: [PATCH 03/79] Icons + Stopwatch Interface --- .../lap.imageset/Contents.json | 21 ++++++++++++++++++ .../Assets.xcassets/lap.imageset/lap.png | Bin 0 -> 2397 bytes .../reset.dataset/Contents.json | 12 ++++++++++ .../Assets.xcassets/reset.dataset/reset | Bin 0 -> 2905 bytes .../start.imageset/Contents.json | 21 ++++++++++++++++++ .../Assets.xcassets/start.imageset/start.png | Bin 0 -> 2519 bytes .../stop.imageset/Contents.json | 21 ++++++++++++++++++ .../Assets.xcassets/stop.imageset/stop.png | Bin 0 -> 2452 bytes 8 files changed, 75 insertions(+) create mode 100644 Stopwatch/Stopwatch/Assets.xcassets/lap.imageset/Contents.json create mode 100644 Stopwatch/Stopwatch/Assets.xcassets/lap.imageset/lap.png create mode 100644 Stopwatch/Stopwatch/Assets.xcassets/reset.dataset/Contents.json create mode 100644 Stopwatch/Stopwatch/Assets.xcassets/reset.dataset/reset create mode 100644 Stopwatch/Stopwatch/Assets.xcassets/start.imageset/Contents.json create mode 100644 Stopwatch/Stopwatch/Assets.xcassets/start.imageset/start.png create mode 100644 Stopwatch/Stopwatch/Assets.xcassets/stop.imageset/Contents.json create mode 100644 Stopwatch/Stopwatch/Assets.xcassets/stop.imageset/stop.png diff --git a/Stopwatch/Stopwatch/Assets.xcassets/lap.imageset/Contents.json b/Stopwatch/Stopwatch/Assets.xcassets/lap.imageset/Contents.json new file mode 100644 index 0000000..cda9aee --- /dev/null +++ b/Stopwatch/Stopwatch/Assets.xcassets/lap.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "lap.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Stopwatch/Stopwatch/Assets.xcassets/lap.imageset/lap.png b/Stopwatch/Stopwatch/Assets.xcassets/lap.imageset/lap.png new file mode 100644 index 0000000000000000000000000000000000000000..7263253b32a28de70f5d2080c3990d476f36a597 GIT binary patch literal 2397 zcmbVOc|25m8$T0CWT_O=GDb;hR(wF(m##~z zB3f?Zl5z{xT%lW3TD@1VYiY5xNbgbUegEil|9H>mbI$L1p5OC*_UH3C8U6xK6Qc!2 z005Zqyto0#={5Np8X(``fpeb7VXbx#QwKtkYK;&E0k#AZfoPswCq7ABO!C-9XV zFiPf?0E2-Ef*^51w3s2mxVoU7wM@i-98?R@T6v5@#niGepY1XcdQyzXpg*gqqgj|Q zL51=C(HsZ{(G(mND<%-hXc_}Yq)=%L+A1^&;qe4IoWoPlv=H1;_(`d2B&etL9i50WH1EZsJ<2oDH&cXRN{#^0$whk%uU{I)r;2;Q!nVJIsC`b*dq97%j z!};8Gv;$u#mMJEMD<&KDC2uYW%i=(Z2Mo#4pDWFjeJ2VLnIRF8X$&mrM5kcMbfN?+ zl8}j53Q5EuPze+XQ51>!ikJMq6~rS!;U~xCf5vA@gv{h5`E3~x=G!`f3S@_1WLa=| z`o;h-J(0&{2Wjv37p8axORbuII^r6FD=6QtBh4_%uPu%Ve^g~#`*1VgA!2q%%C31m z_Nph>!wkj3(knaV|Kx{dxvNXd3);Mc6xF%;*TXDmdZ3fez~EBnosYeThhDLyp{;up z6`rkiO&^k$Z$K zB<^J0TD)njDzS^!HP+31Ivof6(3-q|Kx$bPx_Ug3)4zCh-srMX3VzxR5d=b!GrIn* zQcsBcqzd{aVrIUdICIIXwlPEvDn;jiT>ol7#J3Mg*rg}dT`z@p zISwqGBR{=|ww<gob`TTdyWbF+TbIZ3JX=V@1u=07PN zKf3YEhNCpcl@^~yo?J;nSy=dz-KrJ2I6cq6noT9B*FN^lcfoGe3)e4=f1z*h*v=i; zh>f=rTuK6RmWSu9glzfU;M1CkqP*hhh=^g;I-72r@lV4=K=dH?@#h~4feut0za!wjMr1xaz#Jfk^^oD%}dpZJj2F16y*M^L@0d>EE z#;jaMtWk=oS%=?oK^xTFJ=|C&_Rg`I`O~SU%Rhu1+xA;t|A$h~c`x5i6S05!*|!IM z&+_>z-LoD?&CuN^ZrX?%@oocD_if)7|Dd}pXi(YE+EWsbAi)*0!G z$+H;l1M?%}`>NbC)kFC3nw$+rR`_t#>tpfL zqj?W}w}PU7{EuEr^mzx;j+nqqOZ$?9lS=cMM^|eErkh?!y0&bYz;BC1s>j2fuZPQm@Bh`|{AWf*P^8$Vaf|tq#PR0+GM`lrZ(h`I9?sF< zA@I}aN6Z?tb#=AL+MBz&{+WmEy<%?ZwxWg8i<~g*kGJN)A@f=5!cH{wlhcMv^y2rN-4EX$qBOJX;C4mX2H@(}Yn<$~+d!afGlICA@blPf{ZDCFIAY+}?ZQaJKFaJtt!RBDVjjo)YP76T=VX6+Tp> z9mXE1gd;4wcMh`*vVawDJc&5(;BJdq&9lto`qBcd{L>@*L&!CrvsaH?U17L<)qOz~ zAWY9HN_f6PU%LK$e6uNG#Sg631ptD~D93BYhKZJy5e}riPq|zh z{@A%21OBELIVZDi`eM8kE$6LyaNwD&!lf6}n)W4Crkb>P26pBoRcDyAG(AU%hHQR| or}~=hyL}hwJ(rsFCzdw=L1xC{nTz_)O#blj+y&f-*Z=?k literal 0 HcmV?d00001 diff --git a/Stopwatch/Stopwatch/Assets.xcassets/reset.dataset/Contents.json b/Stopwatch/Stopwatch/Assets.xcassets/reset.dataset/Contents.json new file mode 100644 index 0000000..de83fd3 --- /dev/null +++ b/Stopwatch/Stopwatch/Assets.xcassets/reset.dataset/Contents.json @@ -0,0 +1,12 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "data" : [ + { + "idiom" : "universal", + "filename" : "reset" + } + ] +} \ No newline at end of file diff --git a/Stopwatch/Stopwatch/Assets.xcassets/reset.dataset/reset b/Stopwatch/Stopwatch/Assets.xcassets/reset.dataset/reset new file mode 100644 index 0000000000000000000000000000000000000000..2ab89cc34509db8d3d053d9cfc745ad97c4af338 GIT binary patch literal 2905 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 LKJ;qW9ch07UBWTF literal 0 HcmV?d00001 diff --git a/Stopwatch/Stopwatch/Assets.xcassets/stop.imageset/Contents.json b/Stopwatch/Stopwatch/Assets.xcassets/stop.imageset/Contents.json new file mode 100644 index 0000000..67472ec --- /dev/null +++ b/Stopwatch/Stopwatch/Assets.xcassets/stop.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "stop.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Stopwatch/Stopwatch/Assets.xcassets/stop.imageset/stop.png b/Stopwatch/Stopwatch/Assets.xcassets/stop.imageset/stop.png new file mode 100644 index 0000000000000000000000000000000000000000..01f6ac408d8dc54ca2e7e314c55baf3d3f6f1b56 GIT binary patch literal 2452 zcmbVOdpMM78-GWLLHKkK(rZjs%baJ7nNS*sCI-n_e9hq<#+XAh6UMO>(LqZkL{cg& z+AXzx*@~njhfyN6Hf$3)7p<~v?Wpv9e{}61-+Nu}`#ksa+`s$&-KXn%_xpIc>%mRn z008LGx48JK)-4OKmZs|KKVIXmT2{+kgJj!9Tv;qr0s+n(5eow80%io{3o$wJUCodK z04#~)`31>>7@kzNNPuQ8=%C{SVig(y95%*@nQT5J16fc6Pw0r4{G|>7@;Hu&KoSGX z5YwPY-j;X?v_0O-j~&lvQ#go?PM|{^Rb@Z`$(UfAAX+G;#yKKB+NG-Y3&$7)_)$g1 zcSL+56~yoXX(9;(lF)W2HWo(&$rLn>WJjiuZ9%+B#$fF+cq|G_p^^wxEFS#)AXMHY z94^(@#qF~%mE?$sl*zk9EC!`VDT6{9;MPiN##NrGY%z`S}s~} zfuw8+Pb}k!gy4cjCQGzi=7>-+{S<;g%wT*mER=pulqzMIIHnkbLt`-l!9rXgwWTs& z=)W|+sx9@Ciy@3JBo*zJuvPWoS}uZBx%+2F3yLZ>RBs7SRTO5li-^5j010Ju7e|EZ z2F>Ads01>bO{Or(D0?P_f+CXf92AqoA)yFdCY!*qQnB#tch7_xAj@6NCCX;6Vn!Q1uvnsKMSDx9djFH&P@}~lon0w5rA*E(9 z+BF=3Ir3rM2ip5W2ajTly6S*^OZ)*@W-omLOrZ(UuM>5YO-lP&@2O)(uq3(@eZnd> z$JFN72jr~&l=`f>{AM?7+#)5a&C%ByVGEdYL%a{7pWA==DA~cJODv ze>dixT<3mI&`P1+a_<%>BiHc_qS^rcu_9~r;>U8qw;RAmCp?r^gVF2m1>Pgy*VZBp zozUse%udd!pgT7^Mbx{BjWI0%CX~LXR^ACGyj|bg(j8`7vhvyGr}+t8cUyXVbxWL< z-l3e^2PDP7{+QBwVpCh+VyjVJpr|%+P%r;3?^>{CM};`gmedKGt)Z zC-k}!Ub%Pg$gVh9W^@*+6*lxhcG>FZhkZYuHQJxr6cjVq^!<>&nyg*_s;KhRe%|ZiZJk{y`n9k>%q%S_ zO_p`s-%`^xVUexvhBkSaA#M?#MPfaHrA_Ztzf9FEsk-T&&fm3c&!y8i;KZea{`&N^ zbZq^WbSm#+j9PDqL-F)#I9G$dmYaD+L;kPnLy23X;CsSXbl!RHk#!<97zT$u1o{)X zj6fSC@Uk;g+?tFuJQ8ejG91<+sd#=G?(ul=j){+!0X(!^dzfGFejeXsc?v(Qj#}Ds zQDUr>@#MU8sAq6^cr1bccG6?*sp7&={k6-?uyqY!n!)hnAG12go(T#R^*NRWt6Exo zZL)4j4)3?#6ox#qzP{A`g7FZ{+JC>%(#;mLo@2e&oYu*w8n2(fk$5e+b!J>+Z*XZ3 zL;eb!W{n0ERGkAN=~R19tFG18gQuM}FUvz-^*cW&PCk2aJ35-Pdq@#+Vz8}nKcYTNG+E1uzfkUlX>Tz~E4&r|>0Y1p4FuN+<)m9Eue zU31Qhlua)EY01WYPQ>hjsQyXJM&Ho6w&7B}0ODx{3m1?w7Ie*P&WJi3oTB~IuLel_ zumbbWc1qof0HkGEe4k`4S37z&1i9v|T)7?{K6C3r!C3{e5*cx1`Wvsb`o2G-{jzfE zjQ9q`0cmrDg<3;$Wto#{?kz{lO+ANVnubd8`D8WqJ8?Ud{%vB-R$YUbk*s**4(rbG z0Ak3tMz0%m{e}W16p;>CG@4gD+RCnO-z_g##Q}K!f*#tQeQmWXD_s++ybmV;?e-X( z8Xc_!hl^n^3l0uAJckmu>4K;;jduy;_qptxyf%rZg*43eKK@r@BXsJ~e(1o;t=0(x z23@ZXc!0c6{JELxKMUhqbhW50MORTfMzcjf!9_Zcl?A3c@2;LN2SLXBHU?7JXYTI% uUhg>aMc Date: Fri, 21 Aug 2015 20:11:28 -0400 Subject: [PATCH 04/79] Start and Stop function working --- .../reset.dataset/Contents.json | 12 --- .../reset.imageset/Contents.json | 21 ++++ .../reset => reset.imageset/reset.png} | Bin Stopwatch/Stopwatch/ViewController.swift | 91 +++++++++++++++++- 4 files changed, 111 insertions(+), 13 deletions(-) delete mode 100644 Stopwatch/Stopwatch/Assets.xcassets/reset.dataset/Contents.json create mode 100644 Stopwatch/Stopwatch/Assets.xcassets/reset.imageset/Contents.json rename Stopwatch/Stopwatch/Assets.xcassets/{reset.dataset/reset => reset.imageset/reset.png} (100%) diff --git a/Stopwatch/Stopwatch/Assets.xcassets/reset.dataset/Contents.json b/Stopwatch/Stopwatch/Assets.xcassets/reset.dataset/Contents.json deleted file mode 100644 index de83fd3..0000000 --- a/Stopwatch/Stopwatch/Assets.xcassets/reset.dataset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - }, - "data" : [ - { - "idiom" : "universal", - "filename" : "reset" - } - ] -} \ No newline at end of file diff --git a/Stopwatch/Stopwatch/Assets.xcassets/reset.imageset/Contents.json b/Stopwatch/Stopwatch/Assets.xcassets/reset.imageset/Contents.json new file mode 100644 index 0000000..6f4703b --- /dev/null +++ b/Stopwatch/Stopwatch/Assets.xcassets/reset.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "reset.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Stopwatch/Stopwatch/Assets.xcassets/reset.dataset/reset b/Stopwatch/Stopwatch/Assets.xcassets/reset.imageset/reset.png similarity index 100% rename from Stopwatch/Stopwatch/Assets.xcassets/reset.dataset/reset rename to Stopwatch/Stopwatch/Assets.xcassets/reset.imageset/reset.png diff --git a/Stopwatch/Stopwatch/ViewController.swift b/Stopwatch/Stopwatch/ViewController.swift index bb34a09..16b6678 100644 --- a/Stopwatch/Stopwatch/ViewController.swift +++ b/Stopwatch/Stopwatch/ViewController.swift @@ -9,6 +9,22 @@ import UIKit class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { + + var timer = NSTimer() + + var minutes: Int = 0 + var seconds: Int = 0 + var fractions: Int = 0 + + var minutesString: String = "" + var secondsString: String = "" + var fractionsString: String = "" + var stopwatchString: String = "" + + var startStopWatch: Bool = true + var addLap: Bool = false + + @IBOutlet weak var stopwatchLabel: UILabel! @@ -20,7 +36,7 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour override func viewDidLoad() { super.viewDidLoad() - // Do any additional setup after loading the view, typically from a nib. + stopwatchLabel.text = "00.00.0" } override func didReceiveMemoryWarning() { @@ -28,8 +44,81 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour // Dispose of any resources that can be recreated. } + + // Actions + @IBAction func startStop(sender: AnyObject) { + if startStopWatch == true { + + //Timer is incremented every 0.01 of a second while the startStopWatch is set to true and calls the updateStopwatch method + timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: Selector("updateStopwatch"), userInfo: nil, repeats: true) + + + //The startStopWatch will turn false when the Start button is clicked (so that it can turn true when the Stop button is clicked) + startStopWatch = false + + // When the button reads Start and is clicked, it will change into a Stop button while the timer is firing. + startStopButton.setImage(UIImage(named: "stop.png"), forState: UIControlState.Normal) + + // When the button reads Start and is clicked, it will change the Lap button into a Reset button while the timer is firing. + lapsResetButton.setImage(UIImage(named: "lap.png"), forState: UIControlState.Normal) + + addLap = true + + } + + else { + + // When the Stop button is clicked, it invalidates the timer + timer.invalidate() + + // The startStopWatch will turn true when the Stop button is clicked (so that it can turn false when the Start button is clicked) + startStopWatch = true + + // When the button reads Stop and is clicked, it will change into a Start button while the timer is invalidated. + startStopButton.setImage(UIImage(named: "start.png"), forState: .Normal) + + // When the button reads Stop and is clicked, it will change the Reset button into a Lap button while the timer is invalidated. + lapsResetButton.setImage(UIImage(named: "reset.png"), forState: .Normal) + + addLap = false + + } + } + + func updateStopwatch() { + + // Increments the fraction of a second by 1 + fractions += 1 + + // If the fractions of the a second reaches 100, seconds is incremented by 1 + if fractions == 100 { + + seconds += 1 + fractions = 0 + } + + // If the second reaches 60, minute is incremented by 1 and sets seconds to 0 + if seconds == 60 { + + minutes += 1 + seconds = 0 + } + + + // Sets the strings for fractions, seconds, and minutes. If any number is greater than 9, display a 0 before it. + // The values are a shorthand form of writing if/else statements. Condition ? Result if true : Result if false + fractionsString = fractions > 9 ? "\(fractions)" : "0\(fractions)" + secondsString = seconds > 9 ? "\(seconds)" : "0\(seconds)" + minutesString = minutes > 9 ? "\(minutes)" : "0\(minutes)" + + + //Stopwatch value is stored in stopwatchString formatted with the string for each number (fractions, seconds, minutes) and then set to the stopwatchLabel + stopwatchString = "\(minutesString):\(secondsString).\(fractionsString)" + stopwatchLabel.text = stopwatchString + + } @IBAction func lapsReset(sender: AnyObject) { From f5631327e98cad5d9ca13ac3d5a8cca7826dbff0 Mon Sep 17 00:00:00 2001 From: Jovanny Espinal Date: Fri, 21 Aug 2015 20:17:28 -0400 Subject: [PATCH 05/79] Reset function added --- Stopwatch/Stopwatch/ViewController.swift | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Stopwatch/Stopwatch/ViewController.swift b/Stopwatch/Stopwatch/ViewController.swift index 16b6678..d68d2c2 100644 --- a/Stopwatch/Stopwatch/ViewController.swift +++ b/Stopwatch/Stopwatch/ViewController.swift @@ -36,6 +36,8 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour override func viewDidLoad() { super.viewDidLoad() + + //When the app is first launched, the stopwatchLabel is set to 0 stopwatchLabel.text = "00.00.0" } @@ -123,6 +125,24 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour @IBAction func lapsReset(sender: AnyObject) { + if addLap == true { + + + + } + else { + addLap == false + lapsResetButton.setImage(UIImage(named: "lap.png"), forState: .Normal) + fractions = 0 + seconds = 0 + minutes = 0 + + stopwatchString = "00:00.00" + stopwatchLabel.text = stopwatchString + } + + + } //TableView Methods From 5b30dff1d9687bd73822e8a7bd50f69be48af4b5 Mon Sep 17 00:00:00 2001 From: Jovanny Espinal Date: Fri, 21 Aug 2015 20:48:26 -0400 Subject: [PATCH 06/79] Semi working Lap function. Not capturing the difference in times; capturing the time when the lap button was clicked --- Stopwatch/Stopwatch/ViewController.swift | 25 +++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/Stopwatch/Stopwatch/ViewController.swift b/Stopwatch/Stopwatch/ViewController.swift index d68d2c2..cb9fb31 100644 --- a/Stopwatch/Stopwatch/ViewController.swift +++ b/Stopwatch/Stopwatch/ViewController.swift @@ -21,6 +21,7 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour var fractionsString: String = "" var stopwatchString: String = "" + var laps: [String] = [] var startStopWatch: Bool = true var addLap: Bool = false @@ -66,6 +67,8 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour // When the button reads Start and is clicked, it will change the Lap button into a Reset button while the timer is firing. lapsResetButton.setImage(UIImage(named: "lap.png"), forState: UIControlState.Normal) + + // When the button reads Start, it allows for laps to be added. (refer to the lapsReset method on line 129) addLap = true } @@ -84,6 +87,7 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour // When the button reads Stop and is clicked, it will change the Reset button into a Lap button while the timer is invalidated. lapsResetButton.setImage(UIImage(named: "reset.png"), forState: .Normal) + // When the buttons reads Stop and is clicked, it allows for the stopwatch and laps to be reset (refer to the lapsReset method on line 129) addLap = false } @@ -125,14 +129,29 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour @IBAction func lapsReset(sender: AnyObject) { + if addLap == true { + //Adds the current time, which is stored in stopwatchString (refer to the updateStopWatch method on line 95) + laps.insert(stopwatchString, atIndex: 0) + //Refreshes the table view that contains the lap times + lapsTableView.reloadData() } else { + + addLap == false + + // When the button reads Reset and is clicked, it will change into a Lap button and reset the stopwatchString (just the string) back to 0. lapsResetButton.setImage(UIImage(named: "lap.png"), forState: .Normal) + + // When the button reads Reset and is clicked, it will remove all elements in the laps array and then reload the table view + laps.removeAll(keepCapacity: false) + lapsTableView.reloadData() + + // Reverts the time back to 0 fractions = 0 seconds = 0 minutes = 0 @@ -154,9 +173,9 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour cell.backgroundColor = self.view.backgroundColor - cell.textLabel!.text = "Lap" + cell.textLabel!.text = "Lap \(laps.count - indexPath.row)" - cell.detailTextLabel?.text = "00:00:00" + cell.detailTextLabel?.text = laps[indexPath.row] return cell @@ -164,7 +183,7 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return 3 + return laps.count } From e35ce89cd3f982fc4442f847173bacb927a28f24 Mon Sep 17 00:00:00 2001 From: Jovanny Espinal Date: Fri, 21 Aug 2015 21:40:34 -0400 Subject: [PATCH 07/79] Final stopwatch commit --- Stopwatch/Stopwatch/ViewController.swift | 64 +++++++++++++++++++++--- 1 file changed, 57 insertions(+), 7 deletions(-) diff --git a/Stopwatch/Stopwatch/ViewController.swift b/Stopwatch/Stopwatch/ViewController.swift index cb9fb31..7d65e8d 100644 --- a/Stopwatch/Stopwatch/ViewController.swift +++ b/Stopwatch/Stopwatch/ViewController.swift @@ -11,16 +11,27 @@ import UIKit class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { var timer = NSTimer() + var lapTimer = NSTimer() var minutes: Int = 0 var seconds: Int = 0 var fractions: Int = 0 + var lapMinutes: Int = 0 + var lapSeconds: Int = 0 + var lapFractions: Int = 0 + var minutesString: String = "" var secondsString: String = "" var fractionsString: String = "" var stopwatchString: String = "" + var lapMinutesString: String = "" + var lapSecondsString: String = "" + var lapFractionsString: String = "" + var lapString: String = "" + + var laps: [String] = [] var startStopWatch: Bool = true var addLap: Bool = false @@ -39,7 +50,7 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour super.viewDidLoad() //When the app is first launched, the stopwatchLabel is set to 0 - stopwatchLabel.text = "00.00.0" + stopwatchLabel.text = "00.00.00" } override func didReceiveMemoryWarning() { @@ -56,6 +67,7 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour //Timer is incremented every 0.01 of a second while the startStopWatch is set to true and calls the updateStopwatch method timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: Selector("updateStopwatch"), userInfo: nil, repeats: true) + lapTimer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: ("updateStopwatch"), userInfo: nil, repeats: true) //The startStopWatch will turn false when the Start button is clicked (so that it can turn true when the Stop button is clicked) @@ -77,6 +89,7 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour // When the Stop button is clicked, it invalidates the timer timer.invalidate() + lapTimer.invalidate() // The startStopWatch will turn true when the Stop button is clicked (so that it can turn false when the Start button is clicked) startStopWatch = true @@ -91,18 +104,21 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour addLap = false } + } func updateStopwatch() { // Increments the fraction of a second by 1 fractions += 1 + lapFractions += 1 // If the fractions of the a second reaches 100, seconds is incremented by 1 - if fractions == 100 { + if fractions == 100{ seconds += 1 fractions = 0 + } // If the second reaches 60, minute is incremented by 1 and sets seconds to 0 @@ -110,8 +126,25 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour minutes += 1 seconds = 0 + } + // If the lapFractions of the a second reaches 100, seconds is incremented by 1 + if lapFractions == 100{ + + lapSeconds += 1 + lapFractions = 0 + + } + + // If the lapSeconds reaches 60, minute is incremented by 1 and sets seconds to 0 + if lapSeconds == 60 { + + lapMinutes += 1 + lapSeconds = 0 + + } + // Sets the strings for fractions, seconds, and minutes. If any number is greater than 9, display a 0 before it. // The values are a shorthand form of writing if/else statements. Condition ? Result if true : Result if false @@ -119,11 +152,15 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour secondsString = seconds > 9 ? "\(seconds)" : "0\(seconds)" minutesString = minutes > 9 ? "\(minutes)" : "0\(minutes)" + lapFractionsString = lapFractions > 9 ? "\(lapFractions)" : "0\(lapFractions)" + lapSecondsString = lapSeconds > 9 ? "\(lapSeconds)" : "0\(lapSeconds)" + lapMinutesString = lapMinutes > 9 ? "\(lapMinutes)" : "0\(lapMinutes)" //Stopwatch value is stored in stopwatchString formatted with the string for each number (fractions, seconds, minutes) and then set to the stopwatchLabel stopwatchString = "\(minutesString):\(secondsString).\(fractionsString)" stopwatchLabel.text = stopwatchString + lapString = "\(lapMinutesString):\(lapSecondsString).\(lapFractionsString)" } @@ -132,8 +169,15 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour if addLap == true { - //Adds the current time, which is stored in stopwatchString (refer to the updateStopWatch method on line 95) - laps.insert(stopwatchString, atIndex: 0) + //Adds the current time, which is stored in lapString (refer to the updateStopWatch method on line 95) + laps.insert(lapString, atIndex: 0) + + //Resets the lap counter + lapFractions = 0 + lapSeconds = 0 + lapMinutes = 0 + + lapString = "00:00.00" //Refreshes the table view that contains the lap times lapsTableView.reloadData() @@ -141,7 +185,6 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour } else { - addLap == false // When the button reads Reset and is clicked, it will change into a Lap button and reset the stopwatchString (just the string) back to 0. @@ -156,12 +199,17 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour seconds = 0 minutes = 0 + lapFractions = 0 + lapSeconds = 0 + lapMinutes = 0 + + lapString = "00:00.00" + stopwatchString = "00:00.00" stopwatchLabel.text = stopwatchString + } - - } //TableView Methods @@ -183,7 +231,9 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return laps.count + } From 148403aeb4b49f62f8416bdbf35cc35b8cda1f2e Mon Sep 17 00:00:00 2001 From: Jovanny Espinal Date: Fri, 21 Aug 2015 21:44:04 -0400 Subject: [PATCH 08/79] Final stopwatch commit --- Stopwatch/Stopwatch/ViewController.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Stopwatch/Stopwatch/ViewController.swift b/Stopwatch/Stopwatch/ViewController.swift index 7d65e8d..43035ea 100644 --- a/Stopwatch/Stopwatch/ViewController.swift +++ b/Stopwatch/Stopwatch/ViewController.swift @@ -80,7 +80,7 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour lapsResetButton.setImage(UIImage(named: "lap.png"), forState: UIControlState.Normal) - // When the button reads Start, it allows for laps to be added. (refer to the lapsReset method on line 129) + // When the button reads Start, it allows for laps to be added. (refer to the lapsReset method on line 167) addLap = true } @@ -169,7 +169,7 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour if addLap == true { - //Adds the current time, which is stored in lapString (refer to the updateStopWatch method on line 95) + //Adds the current time, which is stored in lapString (refer to the updateStopWatch method on line 110) laps.insert(lapString, atIndex: 0) //Resets the lap counter From 63d748f24aa9dc19673cdd312e44b6665113eecf Mon Sep 17 00:00:00 2001 From: Derek Date: Fri, 21 Aug 2015 21:46:13 -0400 Subject: [PATCH 09/79] 1st --- .../Base.lproj/LaunchScreen.storyboard | 4 ++-- Stopwatch/Stopwatch/Base.lproj/Main.storyboard | 4 ++-- Stopwatch/Stopwatch/ViewController.swift | 17 ----------------- 3 files changed, 4 insertions(+), 21 deletions(-) diff --git a/Stopwatch/Stopwatch/Base.lproj/LaunchScreen.storyboard b/Stopwatch/Stopwatch/Base.lproj/LaunchScreen.storyboard index 2e721e1..25826ba 100644 --- a/Stopwatch/Stopwatch/Base.lproj/LaunchScreen.storyboard +++ b/Stopwatch/Stopwatch/Base.lproj/LaunchScreen.storyboard @@ -1,7 +1,7 @@ - + - + diff --git a/Stopwatch/Stopwatch/Base.lproj/Main.storyboard b/Stopwatch/Stopwatch/Base.lproj/Main.storyboard index dab7d4c..fb2d4bd 100644 --- a/Stopwatch/Stopwatch/Base.lproj/Main.storyboard +++ b/Stopwatch/Stopwatch/Base.lproj/Main.storyboard @@ -1,7 +1,7 @@ - + - + diff --git a/Stopwatch/Stopwatch/ViewController.swift b/Stopwatch/Stopwatch/ViewController.swift index cb9fb31..18b84a8 100644 --- a/Stopwatch/Stopwatch/ViewController.swift +++ b/Stopwatch/Stopwatch/ViewController.swift @@ -25,7 +25,6 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour var startStopWatch: Bool = true var addLap: Bool = false - @IBOutlet weak var stopwatchLabel: UILabel! @@ -41,12 +40,6 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour //When the app is first launched, the stopwatchLabel is set to 0 stopwatchLabel.text = "00.00.0" } - - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. - } - // Actions @@ -57,7 +50,6 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour //Timer is incremented every 0.01 of a second while the startStopWatch is set to true and calls the updateStopwatch method timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: Selector("updateStopwatch"), userInfo: nil, repeats: true) - //The startStopWatch will turn false when the Start button is clicked (so that it can turn true when the Stop button is clicked) startStopWatch = false @@ -67,10 +59,8 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour // When the button reads Start and is clicked, it will change the Lap button into a Reset button while the timer is firing. lapsResetButton.setImage(UIImage(named: "lap.png"), forState: UIControlState.Normal) - // When the button reads Start, it allows for laps to be added. (refer to the lapsReset method on line 129) addLap = true - } else { @@ -124,11 +114,9 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour stopwatchString = "\(minutesString):\(secondsString).\(fractionsString)" stopwatchLabel.text = stopwatchString - } @IBAction func lapsReset(sender: AnyObject) { - if addLap == true { @@ -141,7 +129,6 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour } else { - addLap == false // When the button reads Reset and is clicked, it will change into a Lap button and reset the stopwatchString (just the string) back to 0. @@ -160,8 +147,6 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour stopwatchLabel.text = stopwatchString } - - } //TableView Methods @@ -178,8 +163,6 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour cell.detailTextLabel?.text = laps[indexPath.row] return cell - - } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { From 993eb32ce67236d6220ff6ba50802c34414a9471 Mon Sep 17 00:00:00 2001 From: Jovanny Espinal Date: Fri, 21 Aug 2015 21:51:01 -0400 Subject: [PATCH 10/79] Stopwatch with updated comments --- Stopwatch/Stopwatch/ViewController.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Stopwatch/Stopwatch/ViewController.swift b/Stopwatch/Stopwatch/ViewController.swift index 43035ea..eeb08ba 100644 --- a/Stopwatch/Stopwatch/ViewController.swift +++ b/Stopwatch/Stopwatch/ViewController.swift @@ -80,7 +80,7 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour lapsResetButton.setImage(UIImage(named: "lap.png"), forState: UIControlState.Normal) - // When the button reads Start, it allows for laps to be added. (refer to the lapsReset method on line 167) + // When the button reads Start, it allows for laps to be added. (refer to the lapsReset method) addLap = true } @@ -100,7 +100,7 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour // When the button reads Stop and is clicked, it will change the Reset button into a Lap button while the timer is invalidated. lapsResetButton.setImage(UIImage(named: "reset.png"), forState: .Normal) - // When the buttons reads Stop and is clicked, it allows for the stopwatch and laps to be reset (refer to the lapsReset method on line 129) + // When the buttons reads Stop and is clicked, it allows for the stopwatch and laps to be reset (refer to the lapsReset method) addLap = false } @@ -169,7 +169,7 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour if addLap == true { - //Adds the current time, which is stored in lapString (refer to the updateStopWatch method on line 110) + //Adds the current time, which is stored in lapString (refer to the updateStopWatch method) laps.insert(lapString, atIndex: 0) //Resets the lap counter From 3c38ccf7e66f6c0c73ff238e94f69d15c53f1e86 Mon Sep 17 00:00:00 2001 From: Jovanny Espinal Date: Fri, 21 Aug 2015 22:19:10 -0400 Subject: [PATCH 11/79] Re-push of Stopwatch --- Stopwatch/Stopwatch/ViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Stopwatch/Stopwatch/ViewController.swift b/Stopwatch/Stopwatch/ViewController.swift index eeb08ba..51b5f0e 100644 --- a/Stopwatch/Stopwatch/ViewController.swift +++ b/Stopwatch/Stopwatch/ViewController.swift @@ -59,7 +59,7 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour } - // Actions + // Actions for interface @IBAction func startStop(sender: AnyObject) { From 29014910f861fa985d73664fcf3f98cba6abb8c4 Mon Sep 17 00:00:00 2001 From: Derek Date: Fri, 21 Aug 2015 22:19:56 -0400 Subject: [PATCH 12/79] t --- Stopwatch/Stopwatch/ViewController.swift | 120 +++++++++++------------ 1 file changed, 60 insertions(+), 60 deletions(-) diff --git a/Stopwatch/Stopwatch/ViewController.swift b/Stopwatch/Stopwatch/ViewController.swift index 952dd97..fd8a5b1 100644 --- a/Stopwatch/Stopwatch/ViewController.swift +++ b/Stopwatch/Stopwatch/ViewController.swift @@ -10,6 +10,8 @@ import UIKit class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { + //MARK: Properties + var timer = NSTimer() var lapTimer = NSTimer() @@ -31,34 +33,32 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour var lapFractionsString: String = "" var lapString: String = "" - var laps: [String] = [] var startStopWatch: Bool = true var addLap: Bool = false - @IBOutlet weak var stopwatchLabel: UILabel! - @IBOutlet weak var lapsTableView: UITableView! @IBOutlet weak var startStopButton: UIButton! - @IBOutlet weak var lapsResetButton: UIButton! + + //MARK: Lifecycle methods override func viewDidLoad() { super.viewDidLoad() - //When the app is first launched, the stopwatchLabel is set to 0 - stopwatchLabel.text = "00.00.00" + //When the app is first launched, the stopwatchLabel is set to 00:00.00 + stopwatchLabel.text = "00:00.00" } - // Actions + //MARK: Actions @IBAction func startStop(sender: AnyObject) { if startStopWatch == true { - //Timer is incremented every 0.01 of a second while the startStopWatch is set to true and calls the updateStopwatch method + //Timer is incremented every 0.01 seconds while the startStopWatch is set to true and calls the updateStopwatch method timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: Selector("updateStopwatch"), userInfo: nil, repeats: true) lapTimer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: ("updateStopwatch"), userInfo: nil, repeats: true) @@ -98,6 +98,54 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour } + @IBAction func lapsReset(sender: AnyObject) { + + if addLap == true { + + //Adds the current time, which is stored in lapString (refer to the updateStopWatch method) + laps.insert(lapString, atIndex: 0) + + //Resets the lap counter + lapFractions = 0 + lapSeconds = 0 + lapMinutes = 0 + + lapString = "00:00.00" + + //Refreshes the table view that contains the lap times + lapsTableView.reloadData() + + } + else { + + addLap == false + + // When the button reads Reset and is clicked, it will change into a Lap button and reset the stopwatchString (just the string) back to 0. + lapsResetButton.setImage(UIImage(named: "lap.png"), forState: .Normal) + + // When the button reads Reset and is clicked, it will remove all elements in the laps array and then reload the table view + laps.removeAll(keepCapacity: false) + lapsTableView.reloadData() + + // Reverts the time back to 0 + fractions = 0 + seconds = 0 + minutes = 0 + + lapFractions = 0 + lapSeconds = 0 + lapMinutes = 0 + + lapString = "00:00.00" + + stopwatchString = "00:00.00" + stopwatchLabel.text = stopwatchString + + } + + } + + //MARK: Update method func updateStopwatch() { // Increments the fraction of a second by 1 @@ -119,7 +167,7 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour } - // If the lapFractions of the a second reaches 100, seconds is incremented by 1 + // If the lapFractions of the a second reaches 100, seconds is incremented by 1 if lapFractions == 100{ lapSeconds += 1 @@ -134,7 +182,7 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour lapSeconds = 0 } - + // Sets the strings for fractions, seconds, and minutes. If any number is greater than 9, display a 0 before it. // The values are a shorthand form of writing if/else statements. Condition ? Result if true : Result if false @@ -150,59 +198,12 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour stopwatchString = "\(minutesString):\(secondsString).\(fractionsString)" stopwatchLabel.text = stopwatchString - - lapString = "\(lapMinutesString):\(lapSecondsString).\(lapFractionsString)" - } - - @IBAction func lapsReset(sender: AnyObject) { - - if addLap == true { - - //Adds the current time, which is stored in lapString (refer to the updateStopWatch method) - laps.insert(lapString, atIndex: 0) - - //Resets the lap counter - lapFractions = 0 - lapSeconds = 0 - lapMinutes = 0 - - lapString = "00:00.00" - - //Refreshes the table view that contains the lap times - lapsTableView.reloadData() - - } - else { - - addLap == false - - // When the button reads Reset and is clicked, it will change into a Lap button and reset the stopwatchString (just the string) back to 0. - lapsResetButton.setImage(UIImage(named: "lap.png"), forState: .Normal) - - // When the button reads Reset and is clicked, it will remove all elements in the laps array and then reload the table view - laps.removeAll(keepCapacity: false) - lapsTableView.reloadData() - - // Reverts the time back to 0 - fractions = 0 - seconds = 0 - minutes = 0 - - lapFractions = 0 - lapSeconds = 0 - lapMinutes = 0 - - lapString = "00:00.00" - - stopwatchString = "00:00.00" - stopwatchLabel.text = stopwatchString - - } + lapString = "\(lapMinutesString):\(lapSecondsString).\(lapFractionsString)" } - //TableView Methods + // MARK: TableView methods func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { @@ -210,7 +211,6 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour cell.backgroundColor = self.view.backgroundColor - cell.textLabel!.text = "Lap \(laps.count - indexPath.row)" cell.detailTextLabel?.text = laps[indexPath.row] From a305ae1de5962b05451a8e0ebc32302c3453926e Mon Sep 17 00:00:00 2001 From: Derek Date: Sat, 22 Aug 2015 12:28:08 -0400 Subject: [PATCH 13/79] fixed second interval --- .../Stopwatch/Base.lproj/Main.storyboard | 13 ++- Stopwatch/Stopwatch/ViewController.swift | 104 ++++++------------ 2 files changed, 39 insertions(+), 78 deletions(-) diff --git a/Stopwatch/Stopwatch/Base.lproj/Main.storyboard b/Stopwatch/Stopwatch/Base.lproj/Main.storyboard index fb2d4bd..8903f8f 100644 --- a/Stopwatch/Stopwatch/Base.lproj/Main.storyboard +++ b/Stopwatch/Stopwatch/Base.lproj/Main.storyboard @@ -33,18 +33,18 @@ - + - + - + @@ -58,7 +58,7 @@ - + @@ -75,7 +75,7 @@ - + @@ -97,7 +97,7 @@ - + @@ -122,6 +122,7 @@ + diff --git a/Stopwatch/Stopwatch/ViewController.swift b/Stopwatch/Stopwatch/ViewController.swift index 6938712..c1904f7 100644 --- a/Stopwatch/Stopwatch/ViewController.swift +++ b/Stopwatch/Stopwatch/ViewController.swift @@ -15,22 +15,12 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour var timer = NSTimer() var lapTimer = NSTimer() - var minutes: Int = 0 - var seconds: Int = 0 - var fractions: Int = 0 - - var lapMinutes: Int = 0 - var lapSeconds: Int = 0 - var lapFractions: Int = 0 - - var minutesString: String = "" - var secondsString: String = "" - var fractionsString: String = "" + var startTime : CFAbsoluteTime = 0 + var elapsedTime : NSTimeInterval = 0 var stopwatchString: String = "" - var lapMinutesString: String = "" - var lapSecondsString: String = "" - var lapFractionsString: String = "" + var lapStartTime : CFAbsoluteTime = 0 + var lapElapsedTime : NSTimeInterval = 0 var lapString: String = "" var laps: [String] = [] @@ -58,6 +48,10 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour if isStopped == true { //start stopwatch + //record start time + startTime = CFAbsoluteTimeGetCurrent() + lapStartTime = CFAbsoluteTimeGetCurrent() + //isStopped is false when the stopwatch is started isStopped = false @@ -96,17 +90,16 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour if canAddLaps == true { //add lap + lapStartTime = CFAbsoluteTimeGetCurrent() //add the time since the last lap to the laps array (refer to the updateStopWatch method) laps.insert(lapString, atIndex: 0) //Reset the lap counter - lapMinutes = 0 - lapSeconds = 0 - lapFractions = 0 + lapElapsedTime = 0 lapString = "00:00.00" - //Refreshes the table view that contains the lap times + //Refreshes the table view that contains the lap tim lapsTableView.reloadData() } @@ -122,77 +115,47 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour lapsResetButton.setImage(UIImage(named: "lap.png"), forState: .Normal) // Reverts all time variables to 0 - fractions = 0 - seconds = 0 - minutes = 0 - - lapFractions = 0 - lapSeconds = 0 - lapMinutes = 0 + elapsedTime = 0 + lapElapsedTime = 0 lapString = "00:00.00" //reset the stopwatchString (just the string) back to 0. stopwatchString = "00:00.00" stopwatchLabel.text = stopwatchString - } - } //MARK: Update method func updateStopwatch() { - // Increments the fractions of a second by 1 - fractions += 1 - lapFractions += 1 + elapsedTime = CFAbsoluteTimeGetCurrent() - startTime + print("elapsed time: \(elapsedTime)") - // If the fractions of a second reaches 100, seconds is incremented by 1 - if fractions == 100{ - - seconds += 1 - fractions = 0 - } + lapElapsedTime = CFAbsoluteTimeGetCurrent() - lapStartTime - // If the second reaches 60, minute is incremented by 1 and sets seconds to 0 - if seconds == 60 { - - minutes += 1 - seconds = 0 - } + print("lap time: \(lapElapsedTime)") - // If the lapFractions of the a second reaches 100, seconds is incremented by 1 - if lapFractions == 100{ - - lapSeconds += 1 - lapFractions = 0 - } - - // If the lapSeconds reaches 60, minute is incremented by 1 and sets seconds to 0 - if lapSeconds == 60 { - - lapMinutes += 1 - lapSeconds = 0 - } - - // Sets the strings for fractions, seconds, and minutes. If any number is greater than 9, display a 0 before it. - // The ternary operations are a shorthand form of writing if/else statements. Condition ? Result if true : Result if false - fractionsString = fractions > 9 ? "\(fractions)" : "0\(fractions)" - secondsString = seconds > 9 ? "\(seconds)" : "0\(seconds)" - minutesString = minutes > 9 ? "\(minutes)" : "0\(minutes)" - - lapFractionsString = lapFractions > 9 ? "\(lapFractions)" : "0\(lapFractions)" - lapSecondsString = lapSeconds > 9 ? "\(lapSeconds)" : "0\(lapSeconds)" - lapMinutesString = lapMinutes > 9 ? "\(lapMinutes)" : "0\(lapMinutes)" - - //Stopwatch value is stored in stopwatchString formatted with the string for each number (fractions, seconds, minutes) and then set to the stopwatchLabel - stopwatchString = "\(minutesString):\(secondsString).\(fractionsString)" + stopwatchString = stringFromTimeInterval(elapsedTime) stopwatchLabel.text = stopwatchString - lapString = "\(lapMinutesString):\(lapSecondsString).\(lapFractionsString)" + lapString = stringFromTimeInterval(lapElapsedTime) } + func stringFromTimeInterval(interval: CFTimeInterval) -> String { + let intInterval = Int(interval) + let minutes = (intInterval / 60) % 60 + let seconds = intInterval % 60 + let milliseconds = interval - floor(interval) + if floor(milliseconds * 100) <= 9{ + print(String(format: "%02d:%02d:0%d", minutes, seconds, floor(milliseconds * 100))) + return String(format: "%02d:%02d:00", minutes, seconds, milliseconds) + } + print(String(format: "%02d:%02d:%.f", minutes, seconds, milliseconds * 100)) + return String(format: "%02d:%02d:%.f", minutes, seconds, milliseconds * 100) + } + // MARK: TableView methods func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { @@ -211,10 +174,7 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return laps.count - } - - } From 15d17f49d1cfadf73439cbf85236b8115af9672c Mon Sep 17 00:00:00 2001 From: Derek Date: Sat, 22 Aug 2015 15:09:48 -0400 Subject: [PATCH 14/79] timer demo --- Stopwatch/Stopwatch/ViewController.swift | 6 - .../Timer Demo.xcodeproj/project.pbxproj | 510 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + Timer Demo/Timer Demo/AppDelegate.swift | 46 ++ .../AppIcon.appiconset/Contents.json | 68 +++ .../Base.lproj/LaunchScreen.storyboard | 49 ++ .../Timer Demo/Base.lproj/Main.storyboard | 39 ++ Timer Demo/Timer Demo/Info.plist | 47 ++ Timer Demo/Timer Demo/Timer.swift | 20 + Timer Demo/Timer Demo/ViewController.swift | 30 ++ Timer Demo/Timer DemoTests/Info.plist | 24 + .../Timer DemoTests/Timer_DemoTests.swift | 35 ++ Timer Demo/Timer DemoUITests/Info.plist | 24 + .../Timer DemoUITests/Timer_DemoUITests.swift | 35 ++ 14 files changed, 934 insertions(+), 6 deletions(-) create mode 100644 Timer Demo/Timer Demo.xcodeproj/project.pbxproj create mode 100644 Timer Demo/Timer Demo.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Timer Demo/Timer Demo/AppDelegate.swift create mode 100644 Timer Demo/Timer Demo/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Timer Demo/Timer Demo/Base.lproj/LaunchScreen.storyboard create mode 100644 Timer Demo/Timer Demo/Base.lproj/Main.storyboard create mode 100644 Timer Demo/Timer Demo/Info.plist create mode 100644 Timer Demo/Timer Demo/Timer.swift create mode 100644 Timer Demo/Timer Demo/ViewController.swift create mode 100644 Timer Demo/Timer DemoTests/Info.plist create mode 100644 Timer Demo/Timer DemoTests/Timer_DemoTests.swift create mode 100644 Timer Demo/Timer DemoUITests/Info.plist create mode 100644 Timer Demo/Timer DemoUITests/Timer_DemoUITests.swift diff --git a/Stopwatch/Stopwatch/ViewController.swift b/Stopwatch/Stopwatch/ViewController.swift index c1904f7..17e4d03 100644 --- a/Stopwatch/Stopwatch/ViewController.swift +++ b/Stopwatch/Stopwatch/ViewController.swift @@ -159,20 +159,14 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour // MARK: TableView methods func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { - let cell = UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: "Cell") - cell.backgroundColor = self.view.backgroundColor - cell.textLabel!.text = "Lap \(laps.count - indexPath.row)" - cell.detailTextLabel?.text = laps[indexPath.row] - return cell } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return laps.count } } diff --git a/Timer Demo/Timer Demo.xcodeproj/project.pbxproj b/Timer Demo/Timer Demo.xcodeproj/project.pbxproj new file mode 100644 index 0000000..4a3b4da --- /dev/null +++ b/Timer Demo/Timer Demo.xcodeproj/project.pbxproj @@ -0,0 +1,510 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 6981737C1B88EFF0000D38F2 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6981737B1B88EFF0000D38F2 /* AppDelegate.swift */; }; + 6981737E1B88EFF0000D38F2 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6981737D1B88EFF0000D38F2 /* ViewController.swift */; }; + 698173811B88EFF0000D38F2 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6981737F1B88EFF0000D38F2 /* Main.storyboard */; }; + 698173831B88EFF0000D38F2 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 698173821B88EFF0000D38F2 /* Assets.xcassets */; }; + 698173861B88EFF0000D38F2 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 698173841B88EFF0000D38F2 /* LaunchScreen.storyboard */; }; + 698173911B88EFF0000D38F2 /* Timer_DemoTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 698173901B88EFF0000D38F2 /* Timer_DemoTests.swift */; }; + 6981739C1B88EFF0000D38F2 /* Timer_DemoUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6981739B1B88EFF0000D38F2 /* Timer_DemoUITests.swift */; }; + 698173AA1B88F28C000D38F2 /* Timer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 698173A91B88F28C000D38F2 /* Timer.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 6981738D1B88EFF0000D38F2 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 698173701B88EFF0000D38F2 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 698173771B88EFF0000D38F2; + remoteInfo = "Timer Demo"; + }; + 698173981B88EFF0000D38F2 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 698173701B88EFF0000D38F2 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 698173771B88EFF0000D38F2; + remoteInfo = "Timer Demo"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 698173781B88EFF0000D38F2 /* Timer Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Timer Demo.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 6981737B1B88EFF0000D38F2 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 6981737D1B88EFF0000D38F2 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 698173801B88EFF0000D38F2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 698173821B88EFF0000D38F2 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 698173851B88EFF0000D38F2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 698173871B88EFF0000D38F2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 6981738C1B88EFF0000D38F2 /* Timer DemoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Timer DemoTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 698173901B88EFF0000D38F2 /* Timer_DemoTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Timer_DemoTests.swift; sourceTree = ""; }; + 698173921B88EFF0000D38F2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 698173971B88EFF0000D38F2 /* Timer DemoUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Timer DemoUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 6981739B1B88EFF0000D38F2 /* Timer_DemoUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Timer_DemoUITests.swift; sourceTree = ""; }; + 6981739D1B88EFF0000D38F2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 698173A91B88F28C000D38F2 /* Timer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Timer.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 698173751B88EFF0000D38F2 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 698173891B88EFF0000D38F2 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 698173941B88EFF0000D38F2 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 6981736F1B88EFF0000D38F2 = { + isa = PBXGroup; + children = ( + 6981737A1B88EFF0000D38F2 /* Timer Demo */, + 6981738F1B88EFF0000D38F2 /* Timer DemoTests */, + 6981739A1B88EFF0000D38F2 /* Timer DemoUITests */, + 698173791B88EFF0000D38F2 /* Products */, + ); + sourceTree = ""; + }; + 698173791B88EFF0000D38F2 /* Products */ = { + isa = PBXGroup; + children = ( + 698173781B88EFF0000D38F2 /* Timer Demo.app */, + 6981738C1B88EFF0000D38F2 /* Timer DemoTests.xctest */, + 698173971B88EFF0000D38F2 /* Timer DemoUITests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 6981737A1B88EFF0000D38F2 /* Timer Demo */ = { + isa = PBXGroup; + children = ( + 6981737B1B88EFF0000D38F2 /* AppDelegate.swift */, + 698173A91B88F28C000D38F2 /* Timer.swift */, + 6981737D1B88EFF0000D38F2 /* ViewController.swift */, + 6981737F1B88EFF0000D38F2 /* Main.storyboard */, + 698173821B88EFF0000D38F2 /* Assets.xcassets */, + 698173841B88EFF0000D38F2 /* LaunchScreen.storyboard */, + 698173871B88EFF0000D38F2 /* Info.plist */, + ); + path = "Timer Demo"; + sourceTree = ""; + }; + 6981738F1B88EFF0000D38F2 /* Timer DemoTests */ = { + isa = PBXGroup; + children = ( + 698173901B88EFF0000D38F2 /* Timer_DemoTests.swift */, + 698173921B88EFF0000D38F2 /* Info.plist */, + ); + path = "Timer DemoTests"; + sourceTree = ""; + }; + 6981739A1B88EFF0000D38F2 /* Timer DemoUITests */ = { + isa = PBXGroup; + children = ( + 6981739B1B88EFF0000D38F2 /* Timer_DemoUITests.swift */, + 6981739D1B88EFF0000D38F2 /* Info.plist */, + ); + path = "Timer DemoUITests"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 698173771B88EFF0000D38F2 /* Timer Demo */ = { + isa = PBXNativeTarget; + buildConfigurationList = 698173A01B88EFF0000D38F2 /* Build configuration list for PBXNativeTarget "Timer Demo" */; + buildPhases = ( + 698173741B88EFF0000D38F2 /* Sources */, + 698173751B88EFF0000D38F2 /* Frameworks */, + 698173761B88EFF0000D38F2 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Timer Demo"; + productName = "Timer Demo"; + productReference = 698173781B88EFF0000D38F2 /* Timer Demo.app */; + productType = "com.apple.product-type.application"; + }; + 6981738B1B88EFF0000D38F2 /* Timer DemoTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 698173A31B88EFF0000D38F2 /* Build configuration list for PBXNativeTarget "Timer DemoTests" */; + buildPhases = ( + 698173881B88EFF0000D38F2 /* Sources */, + 698173891B88EFF0000D38F2 /* Frameworks */, + 6981738A1B88EFF0000D38F2 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 6981738E1B88EFF0000D38F2 /* PBXTargetDependency */, + ); + name = "Timer DemoTests"; + productName = "Timer DemoTests"; + productReference = 6981738C1B88EFF0000D38F2 /* Timer DemoTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 698173961B88EFF0000D38F2 /* Timer DemoUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 698173A61B88EFF0000D38F2 /* Build configuration list for PBXNativeTarget "Timer DemoUITests" */; + buildPhases = ( + 698173931B88EFF0000D38F2 /* Sources */, + 698173941B88EFF0000D38F2 /* Frameworks */, + 698173951B88EFF0000D38F2 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 698173991B88EFF0000D38F2 /* PBXTargetDependency */, + ); + name = "Timer DemoUITests"; + productName = "Timer DemoUITests"; + productReference = 698173971B88EFF0000D38F2 /* Timer DemoUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 698173701B88EFF0000D38F2 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0700; + ORGANIZATIONNAME = dereknetto; + TargetAttributes = { + 698173771B88EFF0000D38F2 = { + CreatedOnToolsVersion = 7.0; + }; + 6981738B1B88EFF0000D38F2 = { + CreatedOnToolsVersion = 7.0; + TestTargetID = 698173771B88EFF0000D38F2; + }; + 698173961B88EFF0000D38F2 = { + CreatedOnToolsVersion = 7.0; + TestTargetID = 698173771B88EFF0000D38F2; + }; + }; + }; + buildConfigurationList = 698173731B88EFF0000D38F2 /* Build configuration list for PBXProject "Timer Demo" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 6981736F1B88EFF0000D38F2; + productRefGroup = 698173791B88EFF0000D38F2 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 698173771B88EFF0000D38F2 /* Timer Demo */, + 6981738B1B88EFF0000D38F2 /* Timer DemoTests */, + 698173961B88EFF0000D38F2 /* Timer DemoUITests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 698173761B88EFF0000D38F2 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 698173861B88EFF0000D38F2 /* LaunchScreen.storyboard in Resources */, + 698173831B88EFF0000D38F2 /* Assets.xcassets in Resources */, + 698173811B88EFF0000D38F2 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 6981738A1B88EFF0000D38F2 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 698173951B88EFF0000D38F2 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 698173741B88EFF0000D38F2 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 698173AA1B88F28C000D38F2 /* Timer.swift in Sources */, + 6981737E1B88EFF0000D38F2 /* ViewController.swift in Sources */, + 6981737C1B88EFF0000D38F2 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 698173881B88EFF0000D38F2 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 698173911B88EFF0000D38F2 /* Timer_DemoTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 698173931B88EFF0000D38F2 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6981739C1B88EFF0000D38F2 /* Timer_DemoUITests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 6981738E1B88EFF0000D38F2 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 698173771B88EFF0000D38F2 /* Timer Demo */; + targetProxy = 6981738D1B88EFF0000D38F2 /* PBXContainerItemProxy */; + }; + 698173991B88EFF0000D38F2 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 698173771B88EFF0000D38F2 /* Timer Demo */; + targetProxy = 698173981B88EFF0000D38F2 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 6981737F1B88EFF0000D38F2 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 698173801B88EFF0000D38F2 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 698173841B88EFF0000D38F2 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 698173851B88EFF0000D38F2 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 6981739E1B88EFF0000D38F2 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + 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 = 9.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 6981739F1B88EFF0000D38F2 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "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 = gnu99; + 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 = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 698173A11B88EFF0000D38F2 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = "Timer Demo/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "nyc.c4q.Derek316x.Timer-Demo"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 698173A21B88EFF0000D38F2 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = "Timer Demo/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "nyc.c4q.Derek316x.Timer-Demo"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 698173A41B88EFF0000D38F2 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + INFOPLIST_FILE = "Timer DemoTests/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "nyc.c4q.Derek316x.Timer-DemoTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Timer Demo.app/Timer Demo"; + }; + name = Debug; + }; + 698173A51B88EFF0000D38F2 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + INFOPLIST_FILE = "Timer DemoTests/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "nyc.c4q.Derek316x.Timer-DemoTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Timer Demo.app/Timer Demo"; + }; + name = Release; + }; + 698173A71B88EFF0000D38F2 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = "Timer DemoUITests/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "nyc.c4q.Derek316x.Timer-DemoUITests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_TARGET_NAME = "Timer Demo"; + USES_XCTRUNNER = YES; + }; + name = Debug; + }; + 698173A81B88EFF0000D38F2 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = "Timer DemoUITests/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "nyc.c4q.Derek316x.Timer-DemoUITests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_TARGET_NAME = "Timer Demo"; + USES_XCTRUNNER = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 698173731B88EFF0000D38F2 /* Build configuration list for PBXProject "Timer Demo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 6981739E1B88EFF0000D38F2 /* Debug */, + 6981739F1B88EFF0000D38F2 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 698173A01B88EFF0000D38F2 /* Build configuration list for PBXNativeTarget "Timer Demo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 698173A11B88EFF0000D38F2 /* Debug */, + 698173A21B88EFF0000D38F2 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; + 698173A31B88EFF0000D38F2 /* Build configuration list for PBXNativeTarget "Timer DemoTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 698173A41B88EFF0000D38F2 /* Debug */, + 698173A51B88EFF0000D38F2 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; + 698173A61B88EFF0000D38F2 /* Build configuration list for PBXNativeTarget "Timer DemoUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 698173A71B88EFF0000D38F2 /* Debug */, + 698173A81B88EFF0000D38F2 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; +/* End XCConfigurationList section */ + }; + rootObject = 698173701B88EFF0000D38F2 /* Project object */; +} diff --git a/Timer Demo/Timer Demo.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Timer Demo/Timer Demo.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..aa4b452 --- /dev/null +++ b/Timer Demo/Timer Demo.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Timer Demo/Timer Demo/AppDelegate.swift b/Timer Demo/Timer Demo/AppDelegate.swift new file mode 100644 index 0000000..840f20d --- /dev/null +++ b/Timer Demo/Timer Demo/AppDelegate.swift @@ -0,0 +1,46 @@ +// +// AppDelegate.swift +// Timer Demo +// +// Created by Z on 8/22/15. +// Copyright © 2015 dereknetto. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + + func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { + // Override point for customization after application launch. + return true + } + + func applicationWillResignActive(application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(application: UIApplication) { + // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + +} + diff --git a/Timer Demo/Timer Demo/Assets.xcassets/AppIcon.appiconset/Contents.json b/Timer Demo/Timer Demo/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..36d2c80 --- /dev/null +++ b/Timer Demo/Timer Demo/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "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" : "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" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Timer Demo/Timer Demo/Base.lproj/LaunchScreen.storyboard b/Timer Demo/Timer Demo/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..ac89b45 --- /dev/null +++ b/Timer Demo/Timer Demo/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard new file mode 100644 index 0000000..8d7b245 --- /dev/null +++ b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Timer Demo/Timer Demo/Info.plist b/Timer Demo/Timer Demo/Info.plist new file mode 100644 index 0000000..40c6215 --- /dev/null +++ b/Timer Demo/Timer Demo/Info.plist @@ -0,0 +1,47 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Timer Demo/Timer Demo/Timer.swift b/Timer Demo/Timer Demo/Timer.swift new file mode 100644 index 0000000..37ad387 --- /dev/null +++ b/Timer Demo/Timer Demo/Timer.swift @@ -0,0 +1,20 @@ +// +// Timer.swift +// Timer Demo +// +// Created by Z on 8/22/15. +// Copyright © 2015 dereknetto. All rights reserved. +// + +import UIKit + +class Timer: NSObject { + + var startTime: CFTimeInterval! + var remainingTime: CFTimeInterval! + + init(startTime:CFTimeInterval){ + self.startTime = startTime + self.remainingTime = startTime + } +} diff --git a/Timer Demo/Timer Demo/ViewController.swift b/Timer Demo/Timer Demo/ViewController.swift new file mode 100644 index 0000000..322080c --- /dev/null +++ b/Timer Demo/Timer Demo/ViewController.swift @@ -0,0 +1,30 @@ +// +// ViewController.swift +// Timer Demo +// +// Created by Z on 8/22/15. +// Copyright © 2015 dereknetto. All rights reserved. +// + +import UIKit +import QuartzCore + +class ViewController: UIViewController { + + var displayLink : CADisplayLink! + var timers = []; + let popcornTimer = Timer.init(startTime: 30.000) + + override func viewDidLoad() { + super.viewDidLoad() + + displayLink = CADisplayLink(target: self, selector: Selector("updateTimer")) + displayLink.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes) + } + + func updateTimer(){ + popcornTimer.remainingTime = popcornTimer.remainingTime - displayLink.duration + print("Remaining popcorn time: \(popcornTimer.remainingTime)") + } +} + diff --git a/Timer Demo/Timer DemoTests/Info.plist b/Timer Demo/Timer DemoTests/Info.plist new file mode 100644 index 0000000..ba72822 --- /dev/null +++ b/Timer Demo/Timer DemoTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/Timer Demo/Timer DemoTests/Timer_DemoTests.swift b/Timer Demo/Timer DemoTests/Timer_DemoTests.swift new file mode 100644 index 0000000..f1a0c6d --- /dev/null +++ b/Timer Demo/Timer DemoTests/Timer_DemoTests.swift @@ -0,0 +1,35 @@ +// +// Timer_DemoTests.swift +// Timer DemoTests +// +// Created by Z on 8/22/15. +// Copyright © 2015 dereknetto. All rights reserved. +// + +import XCTest + +class Timer_DemoTests: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testPerformanceExample() { + // This is an example of a performance test case. + self.measureBlock() { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/Timer Demo/Timer DemoUITests/Info.plist b/Timer Demo/Timer DemoUITests/Info.plist new file mode 100644 index 0000000..ba72822 --- /dev/null +++ b/Timer Demo/Timer DemoUITests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/Timer Demo/Timer DemoUITests/Timer_DemoUITests.swift b/Timer Demo/Timer DemoUITests/Timer_DemoUITests.swift new file mode 100644 index 0000000..de29cb4 --- /dev/null +++ b/Timer Demo/Timer DemoUITests/Timer_DemoUITests.swift @@ -0,0 +1,35 @@ +// +// Timer_DemoUITests.swift +// Timer DemoUITests +// +// Created by Z on 8/22/15. +// Copyright © 2015 dereknetto. All rights reserved. +// + +import Foundation +import XCTest + +class Timer_DemoUITests: XCTestCase { + + override func setUp() { + super.setUp() + + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. + XCUIApplication().launch() + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // Use recording to get started writing UI tests. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + +} From 6e34ba9da56f4f20a3c979baf1ef595aa031ce6f Mon Sep 17 00:00:00 2001 From: Derek Date: Sat, 22 Aug 2015 15:56:04 -0400 Subject: [PATCH 15/79] timer logic v1 --- Timer Demo/Timer Demo/Timer.swift | 1 + Timer Demo/Timer Demo/ViewController.swift | 28 +++++++++++++++++----- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/Timer Demo/Timer Demo/Timer.swift b/Timer Demo/Timer Demo/Timer.swift index 37ad387..fae24e1 100644 --- a/Timer Demo/Timer Demo/Timer.swift +++ b/Timer Demo/Timer Demo/Timer.swift @@ -12,6 +12,7 @@ class Timer: NSObject { var startTime: CFTimeInterval! var remainingTime: CFTimeInterval! + var isPaused = false init(startTime:CFTimeInterval){ self.startTime = startTime diff --git a/Timer Demo/Timer Demo/ViewController.swift b/Timer Demo/Timer Demo/ViewController.swift index 322080c..3ce0d52 100644 --- a/Timer Demo/Timer Demo/ViewController.swift +++ b/Timer Demo/Timer Demo/ViewController.swift @@ -12,19 +12,35 @@ import QuartzCore class ViewController: UIViewController { var displayLink : CADisplayLink! - var timers = []; + var timers: [Timer] = []; let popcornTimer = Timer.init(startTime: 30.000) override func viewDidLoad() { super.viewDidLoad() - displayLink = CADisplayLink(target: self, selector: Selector("updateTimer")) + displayLink = CADisplayLink(target: self, selector: Selector("update")) displayLink.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes) } - func updateTimer(){ - popcornTimer.remainingTime = popcornTimer.remainingTime - displayLink.duration + func addTimer(timer:Timer){ + timers.append(timer) + } + + func updateTimer(timer:Timer){ + timer.remainingTime = popcornTimer.remainingTime - displayLink.duration print("Remaining popcorn time: \(popcornTimer.remainingTime)") } -} - + + func update(){ + for timer in timers{ + if timer.isPaused = false{ + updateTimer(timer) + } + } + } + + + + + +} \ No newline at end of file From 435547db9660542cd95b9fb7e8a93fcb1e41efc1 Mon Sep 17 00:00:00 2001 From: Derek Date: Sat, 22 Aug 2015 15:57:18 -0400 Subject: [PATCH 16/79] fixed print --- Timer Demo/Timer Demo/ViewController.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Timer Demo/Timer Demo/ViewController.swift b/Timer Demo/Timer Demo/ViewController.swift index 3ce0d52..e5c48f9 100644 --- a/Timer Demo/Timer Demo/ViewController.swift +++ b/Timer Demo/Timer Demo/ViewController.swift @@ -27,8 +27,8 @@ class ViewController: UIViewController { } func updateTimer(timer:Timer){ - timer.remainingTime = popcornTimer.remainingTime - displayLink.duration - print("Remaining popcorn time: \(popcornTimer.remainingTime)") + timer.remainingTime = timer.remainingTime - displayLink.duration + print("Remaining time: \(timer.remainingTime)") } func update(){ From be588c990dc7ba59a3f4f0d92a9a3548bbb8fcd9 Mon Sep 17 00:00:00 2001 From: Jovanny Espinal Date: Sat, 22 Aug 2015 12:29:31 -0400 Subject: [PATCH 17/79] Touched storyboard by accident --- Stopwatch/Stopwatch/Base.lproj/Main.storyboard | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/Stopwatch/Stopwatch/Base.lproj/Main.storyboard b/Stopwatch/Stopwatch/Base.lproj/Main.storyboard index 8903f8f..e53ef98 100644 --- a/Stopwatch/Stopwatch/Base.lproj/Main.storyboard +++ b/Stopwatch/Stopwatch/Base.lproj/Main.storyboard @@ -1,7 +1,7 @@ - + - + @@ -38,7 +38,16 @@ - + + + + + + + + + + From 4971119a8f4b6e5f92751189ee6f9f7076c289dc Mon Sep 17 00:00:00 2001 From: Jovanny Espinal Date: Sat, 22 Aug 2015 15:57:46 -0400 Subject: [PATCH 18/79] Storyboard updated --- .../Timer Demo/Assets.xcassets/Contents.json | 6 ++ .../lap.imageset/Contents.json | 21 ++++++ .../Assets.xcassets/lap.imageset/lap.png | Bin 0 -> 2397 bytes .../reset.imageset/Contents.json | 21 ++++++ .../Assets.xcassets/reset.imageset/reset.png | Bin 0 -> 2905 bytes .../start.imageset/Contents.json | 21 ++++++ .../Assets.xcassets/start.imageset/start.png | Bin 0 -> 2519 bytes .../stop.imageset/Contents.json | 21 ++++++ .../Assets.xcassets/stop.imageset/stop.png | Bin 0 -> 2452 bytes .../Timer Demo/Base.lproj/Main.storyboard | 69 +++++++++++++++--- 10 files changed, 149 insertions(+), 10 deletions(-) create mode 100644 Timer Demo/Timer Demo/Assets.xcassets/Contents.json create mode 100644 Timer Demo/Timer Demo/Assets.xcassets/lap.imageset/Contents.json create mode 100644 Timer Demo/Timer Demo/Assets.xcassets/lap.imageset/lap.png create mode 100644 Timer Demo/Timer Demo/Assets.xcassets/reset.imageset/Contents.json create mode 100644 Timer Demo/Timer Demo/Assets.xcassets/reset.imageset/reset.png create mode 100644 Timer Demo/Timer Demo/Assets.xcassets/start.imageset/Contents.json create mode 100644 Timer Demo/Timer Demo/Assets.xcassets/start.imageset/start.png create mode 100644 Timer Demo/Timer Demo/Assets.xcassets/stop.imageset/Contents.json create mode 100644 Timer Demo/Timer Demo/Assets.xcassets/stop.imageset/stop.png diff --git a/Timer Demo/Timer Demo/Assets.xcassets/Contents.json b/Timer Demo/Timer Demo/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/Timer Demo/Timer Demo/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Timer Demo/Timer Demo/Assets.xcassets/lap.imageset/Contents.json b/Timer Demo/Timer Demo/Assets.xcassets/lap.imageset/Contents.json new file mode 100644 index 0000000..cda9aee --- /dev/null +++ b/Timer Demo/Timer Demo/Assets.xcassets/lap.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "lap.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Timer Demo/Timer Demo/Assets.xcassets/lap.imageset/lap.png b/Timer Demo/Timer Demo/Assets.xcassets/lap.imageset/lap.png new file mode 100644 index 0000000000000000000000000000000000000000..7263253b32a28de70f5d2080c3990d476f36a597 GIT binary patch literal 2397 zcmbVOc|25m8$T0CWT_O=GDb;hR(wF(m##~z zB3f?Zl5z{xT%lW3TD@1VYiY5xNbgbUegEil|9H>mbI$L1p5OC*_UH3C8U6xK6Qc!2 z005Zqyto0#={5Np8X(``fpeb7VXbx#QwKtkYK;&E0k#AZfoPswCq7ABO!C-9XV zFiPf?0E2-Ef*^51w3s2mxVoU7wM@i-98?R@T6v5@#niGepY1XcdQyzXpg*gqqgj|Q zL51=C(HsZ{(G(mND<%-hXc_}Yq)=%L+A1^&;qe4IoWoPlv=H1;_(`d2B&etL9i50WH1EZsJ<2oDH&cXRN{#^0$whk%uU{I)r;2;Q!nVJIsC`b*dq97%j z!};8Gv;$u#mMJEMD<&KDC2uYW%i=(Z2Mo#4pDWFjeJ2VLnIRF8X$&mrM5kcMbfN?+ zl8}j53Q5EuPze+XQ51>!ikJMq6~rS!;U~xCf5vA@gv{h5`E3~x=G!`f3S@_1WLa=| z`o;h-J(0&{2Wjv37p8axORbuII^r6FD=6QtBh4_%uPu%Ve^g~#`*1VgA!2q%%C31m z_Nph>!wkj3(knaV|Kx{dxvNXd3);Mc6xF%;*TXDmdZ3fez~EBnosYeThhDLyp{;up z6`rkiO&^k$Z$K zB<^J0TD)njDzS^!HP+31Ivof6(3-q|Kx$bPx_Ug3)4zCh-srMX3VzxR5d=b!GrIn* zQcsBcqzd{aVrIUdICIIXwlPEvDn;jiT>ol7#J3Mg*rg}dT`z@p zISwqGBR{=|ww<gob`TTdyWbF+TbIZ3JX=V@1u=07PN zKf3YEhNCpcl@^~yo?J;nSy=dz-KrJ2I6cq6noT9B*FN^lcfoGe3)e4=f1z*h*v=i; zh>f=rTuK6RmWSu9glzfU;M1CkqP*hhh=^g;I-72r@lV4=K=dH?@#h~4feut0za!wjMr1xaz#Jfk^^oD%}dpZJj2F16y*M^L@0d>EE z#;jaMtWk=oS%=?oK^xTFJ=|C&_Rg`I`O~SU%Rhu1+xA;t|A$h~c`x5i6S05!*|!IM z&+_>z-LoD?&CuN^ZrX?%@oocD_if)7|Dd}pXi(YE+EWsbAi)*0!G z$+H;l1M?%}`>NbC)kFC3nw$+rR`_t#>tpfL zqj?W}w}PU7{EuEr^mzx;j+nqqOZ$?9lS=cMM^|eErkh?!y0&bYz;BC1s>j2fuZPQm@Bh`|{AWf*P^8$Vaf|tq#PR0+GM`lrZ(h`I9?sF< zA@I}aN6Z?tb#=AL+MBz&{+WmEy<%?ZwxWg8i<~g*kGJN)A@f=5!cH{wlhcMv^y2rN-4EX$qBOJX;C4mX2H@(}Yn<$~+d!afGlICA@blPf{ZDCFIAY+}?ZQaJKFaJtt!RBDVjjo)YP76T=VX6+Tp> z9mXE1gd;4wcMh`*vVawDJc&5(;BJdq&9lto`qBcd{L>@*L&!CrvsaH?U17L<)qOz~ zAWY9HN_f6PU%LK$e6uNG#Sg631ptD~D93BYhKZJy5e}riPq|zh z{@A%21OBELIVZDi`eM8kE$6LyaNwD&!lf6}n)W4Crkb>P26pBoRcDyAG(AU%hHQR| or}~=hyL}hwJ(rsFCzdw=L1xC{nTz_)O#blj+y&f-*Z=?k literal 0 HcmV?d00001 diff --git a/Timer Demo/Timer Demo/Assets.xcassets/reset.imageset/Contents.json b/Timer Demo/Timer Demo/Assets.xcassets/reset.imageset/Contents.json new file mode 100644 index 0000000..6f4703b --- /dev/null +++ b/Timer Demo/Timer Demo/Assets.xcassets/reset.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "reset.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Timer Demo/Timer Demo/Assets.xcassets/reset.imageset/reset.png b/Timer Demo/Timer Demo/Assets.xcassets/reset.imageset/reset.png new file mode 100644 index 0000000000000000000000000000000000000000..2ab89cc34509db8d3d053d9cfc745ad97c4af338 GIT binary patch literal 2905 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 LKJ;qW9ch07UBWTF literal 0 HcmV?d00001 diff --git a/Timer Demo/Timer Demo/Assets.xcassets/stop.imageset/Contents.json b/Timer Demo/Timer Demo/Assets.xcassets/stop.imageset/Contents.json new file mode 100644 index 0000000..67472ec --- /dev/null +++ b/Timer Demo/Timer Demo/Assets.xcassets/stop.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "stop.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Timer Demo/Timer Demo/Assets.xcassets/stop.imageset/stop.png b/Timer Demo/Timer Demo/Assets.xcassets/stop.imageset/stop.png new file mode 100644 index 0000000000000000000000000000000000000000..01f6ac408d8dc54ca2e7e314c55baf3d3f6f1b56 GIT binary patch literal 2452 zcmbVOdpMM78-GWLLHKkK(rZjs%baJ7nNS*sCI-n_e9hq<#+XAh6UMO>(LqZkL{cg& z+AXzx*@~njhfyN6Hf$3)7p<~v?Wpv9e{}61-+Nu}`#ksa+`s$&-KXn%_xpIc>%mRn z008LGx48JK)-4OKmZs|KKVIXmT2{+kgJj!9Tv;qr0s+n(5eow80%io{3o$wJUCodK z04#~)`31>>7@kzNNPuQ8=%C{SVig(y95%*@nQT5J16fc6Pw0r4{G|>7@;Hu&KoSGX z5YwPY-j;X?v_0O-j~&lvQ#go?PM|{^Rb@Z`$(UfAAX+G;#yKKB+NG-Y3&$7)_)$g1 zcSL+56~yoXX(9;(lF)W2HWo(&$rLn>WJjiuZ9%+B#$fF+cq|G_p^^wxEFS#)AXMHY z94^(@#qF~%mE?$sl*zk9EC!`VDT6{9;MPiN##NrGY%z`S}s~} zfuw8+Pb}k!gy4cjCQGzi=7>-+{S<;g%wT*mER=pulqzMIIHnkbLt`-l!9rXgwWTs& z=)W|+sx9@Ciy@3JBo*zJuvPWoS}uZBx%+2F3yLZ>RBs7SRTO5li-^5j010Ju7e|EZ z2F>Ads01>bO{Or(D0?P_f+CXf92AqoA)yFdCY!*qQnB#tch7_xAj@6NCCX;6Vn!Q1uvnsKMSDx9djFH&P@}~lon0w5rA*E(9 z+BF=3Ir3rM2ip5W2ajTly6S*^OZ)*@W-omLOrZ(UuM>5YO-lP&@2O)(uq3(@eZnd> z$JFN72jr~&l=`f>{AM?7+#)5a&C%ByVGEdYL%a{7pWA==DA~cJODv ze>dixT<3mI&`P1+a_<%>BiHc_qS^rcu_9~r;>U8qw;RAmCp?r^gVF2m1>Pgy*VZBp zozUse%udd!pgT7^Mbx{BjWI0%CX~LXR^ACGyj|bg(j8`7vhvyGr}+t8cUyXVbxWL< z-l3e^2PDP7{+QBwVpCh+VyjVJpr|%+P%r;3?^>{CM};`gmedKGt)Z zC-k}!Ub%Pg$gVh9W^@*+6*lxhcG>FZhkZYuHQJxr6cjVq^!<>&nyg*_s;KhRe%|ZiZJk{y`n9k>%q%S_ zO_p`s-%`^xVUexvhBkSaA#M?#MPfaHrA_Ztzf9FEsk-T&&fm3c&!y8i;KZea{`&N^ zbZq^WbSm#+j9PDqL-F)#I9G$dmYaD+L;kPnLy23X;CsSXbl!RHk#!<97zT$u1o{)X zj6fSC@Uk;g+?tFuJQ8ejG91<+sd#=G?(ul=j){+!0X(!^dzfGFejeXsc?v(Qj#}Ds zQDUr>@#MU8sAq6^cr1bccG6?*sp7&={k6-?uyqY!n!)hnAG12go(T#R^*NRWt6Exo zZL)4j4)3?#6ox#qzP{A`g7FZ{+JC>%(#;mLo@2e&oYu*w8n2(fk$5e+b!J>+Z*XZ3 zL;eb!W{n0ERGkAN=~R19tFG18gQuM}FUvz-^*cW&PCk2aJ35-Pdq@#+Vz8}nKcYTNG+E1uzfkUlX>Tz~E4&r|>0Y1p4FuN+<)m9Eue zU31Qhlua)EY01WYPQ>hjsQyXJM&Ho6w&7B}0ODx{3m1?w7Ie*P&WJi3oTB~IuLel_ zumbbWc1qof0HkGEe4k`4S37z&1i9v|T)7?{K6C3r!C3{e5*cx1`Wvsb`o2G-{jzfE zjQ9q`0cmrDg<3;$Wto#{?kz{lO+ANVnubd8`D8WqJ8?Ud{%vB-R$YUbk*s**4(rbG z0Ak3tMz0%m{e}W16p;>CG@4gD+RCnO-z_g##Q}K!f*#tQeQmWXD_s++ybmV;?e-X( z8Xc_!hl^n^3l0uAJckmu>4K;;jduy;_qptxyf%rZg*43eKK@r@BXsJ~e(1o;t=0(x z23@ZXc!0c6{JELxKMUhqbhW50MORTfMzcjf!9_Zcl?A3c@2;LN2SLXBHU?7JXYTI% uUhg>aMc - + - + + @@ -16,24 +17,72 @@ - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 086863f69fa916df66c02f90ca51be5277202e65 Mon Sep 17 00:00:00 2001 From: Jovanny Espinal Date: Sat, 22 Aug 2015 16:03:58 -0400 Subject: [PATCH 19/79] Stopwatch/Timer clock draft --- Timer Demo/Timer Demo/ViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Timer Demo/Timer Demo/ViewController.swift b/Timer Demo/Timer Demo/ViewController.swift index e5c48f9..c7c793b 100644 --- a/Timer Demo/Timer Demo/ViewController.swift +++ b/Timer Demo/Timer Demo/ViewController.swift @@ -33,7 +33,7 @@ class ViewController: UIViewController { func update(){ for timer in timers{ - if timer.isPaused = false{ + if timer.isPaused == false{ updateTimer(timer) } } From 73eda19546317aa484ed74be22d8c1f07cb04583 Mon Sep 17 00:00:00 2001 From: Jovanny Espinal Date: Sat, 22 Aug 2015 17:00:30 -0400 Subject: [PATCH 20/79] Fixed Table Cell Detail View --- .../Timer Demo/Base.lproj/Main.storyboard | 91 ++++++++++++------- Timer Demo/Timer Demo/ViewController.swift | 12 ++- 2 files changed, 68 insertions(+), 35 deletions(-) diff --git a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard index 0603061..547a675 100644 --- a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard +++ b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard @@ -1,10 +1,26 @@ - + + + + + + + + + + + + + + + + + @@ -23,66 +39,73 @@ - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - + - - - + + - + - + diff --git a/Timer Demo/Timer Demo/ViewController.swift b/Timer Demo/Timer Demo/ViewController.swift index c7c793b..ff2fe8a 100644 --- a/Timer Demo/Timer Demo/ViewController.swift +++ b/Timer Demo/Timer Demo/ViewController.swift @@ -9,7 +9,7 @@ import UIKit import QuartzCore -class ViewController: UIViewController { +class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { var displayLink : CADisplayLink! var timers: [Timer] = []; @@ -40,7 +40,17 @@ class ViewController: UIViewController { } + func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) + cell.textLabel!.text = "Test" + cell.detailTextLabel!.text = "Detail Test" + + return cell + } + func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return 1 + } } \ No newline at end of file From 32d5ea4cad1968b59fd9b661f5a1ea3e86302f45 Mon Sep 17 00:00:00 2001 From: Jovanny Espinal Date: Sat, 22 Aug 2015 17:59:24 -0400 Subject: [PATCH 21/79] Custom table cell label displaying timer --- .../Timer Demo.xcodeproj/project.pbxproj | 7 ++++ .../Timer Demo/Base.lproj/Main.storyboard | 38 ++++++++++++------- Timer Demo/Timer Demo/TableViewCell.swift | 28 ++++++++++++++ Timer Demo/Timer Demo/ViewController.swift | 22 +++++++++-- 4 files changed, 77 insertions(+), 18 deletions(-) create mode 100644 Timer Demo/Timer Demo/TableViewCell.swift diff --git a/Timer Demo/Timer Demo.xcodeproj/project.pbxproj b/Timer Demo/Timer Demo.xcodeproj/project.pbxproj index 4a3b4da..bb0c839 100644 --- a/Timer Demo/Timer Demo.xcodeproj/project.pbxproj +++ b/Timer Demo/Timer Demo.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 5016E10C1B89209300C5EFFD /* TableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5016E10B1B89209300C5EFFD /* TableViewCell.swift */; }; 6981737C1B88EFF0000D38F2 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6981737B1B88EFF0000D38F2 /* AppDelegate.swift */; }; 6981737E1B88EFF0000D38F2 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6981737D1B88EFF0000D38F2 /* ViewController.swift */; }; 698173811B88EFF0000D38F2 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6981737F1B88EFF0000D38F2 /* Main.storyboard */; }; @@ -35,6 +36,7 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 5016E10B1B89209300C5EFFD /* TableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableViewCell.swift; sourceTree = ""; }; 698173781B88EFF0000D38F2 /* Timer Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Timer Demo.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 6981737B1B88EFF0000D38F2 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 6981737D1B88EFF0000D38F2 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; @@ -103,6 +105,7 @@ 698173A91B88F28C000D38F2 /* Timer.swift */, 6981737D1B88EFF0000D38F2 /* ViewController.swift */, 6981737F1B88EFF0000D38F2 /* Main.storyboard */, + 5016E10B1B89209300C5EFFD /* TableViewCell.swift */, 698173821B88EFF0000D38F2 /* Assets.xcassets */, 698173841B88EFF0000D38F2 /* LaunchScreen.storyboard */, 698173871B88EFF0000D38F2 /* Info.plist */, @@ -259,6 +262,7 @@ buildActionMask = 2147483647; files = ( 698173AA1B88F28C000D38F2 /* Timer.swift in Sources */, + 5016E10C1B89209300C5EFFD /* TableViewCell.swift in Sources */, 6981737E1B88EFF0000D38F2 /* ViewController.swift in Sources */, 6981737C1B88EFF0000D38F2 /* AppDelegate.swift in Sources */, ); @@ -487,6 +491,7 @@ 698173A21B88EFF0000D38F2 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; 698173A31B88EFF0000D38F2 /* Build configuration list for PBXNativeTarget "Timer DemoTests" */ = { isa = XCConfigurationList; @@ -495,6 +500,7 @@ 698173A51B88EFF0000D38F2 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; 698173A61B88EFF0000D38F2 /* Build configuration list for PBXNativeTarget "Timer DemoUITests" */ = { isa = XCConfigurationList; @@ -503,6 +509,7 @@ 698173A81B88EFF0000D38F2 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; diff --git a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard index 547a675..1e3f89f 100644 --- a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard +++ b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard @@ -2,6 +2,7 @@ + @@ -45,33 +46,39 @@ - - + + - + - + + + + + + + + + + @@ -102,6 +109,9 @@ + + + diff --git a/Timer Demo/Timer Demo/TableViewCell.swift b/Timer Demo/Timer Demo/TableViewCell.swift new file mode 100644 index 0000000..87c6596 --- /dev/null +++ b/Timer Demo/Timer Demo/TableViewCell.swift @@ -0,0 +1,28 @@ +// +// TableViewCell.swift +// Timer Demo +// +// Created by Jovanny Espinal on 8/22/15. +// Copyright © 2015 dereknetto. All rights reserved. +// + +import UIKit + +class TableViewCell: UITableViewCell { + + @IBOutlet weak var timerLabel: UILabel! + @IBOutlet weak var startPauseButton: UIButton! + var timerString : String! + + override func awakeFromNib() { + super.awakeFromNib() + self.timerLabel.text = timerString + } + + override func setSelected(selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + + // Configure the view for the selected state + } + +} diff --git a/Timer Demo/Timer Demo/ViewController.swift b/Timer Demo/Timer Demo/ViewController.swift index ff2fe8a..5d6e539 100644 --- a/Timer Demo/Timer Demo/ViewController.swift +++ b/Timer Demo/Timer Demo/ViewController.swift @@ -11,6 +11,10 @@ import QuartzCore class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { + @IBOutlet weak var timerLabel: UILabel! + @IBOutlet weak var startPauseButton: UIButton! + @IBOutlet weak var tableView: UITableView! + var displayLink : CADisplayLink! var timers: [Timer] = []; let popcornTimer = Timer.init(startTime: 30.000) @@ -20,6 +24,9 @@ class ViewController: UIViewController, UITableViewDataSource, UITableViewDelega displayLink = CADisplayLink(target: self, selector: Selector("update")) displayLink.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes) + + addTimer(popcornTimer) + } func addTimer(timer:Timer){ @@ -29,6 +36,7 @@ class ViewController: UIViewController, UITableViewDataSource, UITableViewDelega func updateTimer(timer:Timer){ timer.remainingTime = timer.remainingTime - displayLink.duration print("Remaining time: \(timer.remainingTime)") + } func update(){ @@ -37,19 +45,25 @@ class ViewController: UIViewController, UITableViewDataSource, UITableViewDelega updateTimer(timer) } } + + tableView.reloadData() } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { - let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) - cell.textLabel!.text = "Test" - cell.detailTextLabel!.text = "Detail Test" + let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! TableViewCell + + cell.timerLabel.text = String(timers[indexPath.row].remainingTime) + + cell.startPauseButton.tag = indexPath.row + + //ADD TARGET. VIDEO @ 9:00 return cell } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return 1 + return timers.count } From c2cd82bcb51d4f557e98891da46a044751b154c3 Mon Sep 17 00:00:00 2001 From: Jovanny Espinal Date: Sun, 23 Aug 2015 12:18:39 -0400 Subject: [PATCH 22/79] Timer in table cell with button udpate --Need to add start/cancel feature --- .../Timer Demo.xcodeproj/project.pbxproj | 2 +- Timer Demo/Timer Demo/TableViewCell.swift | 5 ++-- Timer Demo/Timer Demo/ViewController.swift | 26 ++++++++++++++++--- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/Timer Demo/Timer Demo.xcodeproj/project.pbxproj b/Timer Demo/Timer Demo.xcodeproj/project.pbxproj index bb0c839..5830b26 100644 --- a/Timer Demo/Timer Demo.xcodeproj/project.pbxproj +++ b/Timer Demo/Timer Demo.xcodeproj/project.pbxproj @@ -103,9 +103,9 @@ children = ( 6981737B1B88EFF0000D38F2 /* AppDelegate.swift */, 698173A91B88F28C000D38F2 /* Timer.swift */, + 5016E10B1B89209300C5EFFD /* TableViewCell.swift */, 6981737D1B88EFF0000D38F2 /* ViewController.swift */, 6981737F1B88EFF0000D38F2 /* Main.storyboard */, - 5016E10B1B89209300C5EFFD /* TableViewCell.swift */, 698173821B88EFF0000D38F2 /* Assets.xcassets */, 698173841B88EFF0000D38F2 /* LaunchScreen.storyboard */, 698173871B88EFF0000D38F2 /* Info.plist */, diff --git a/Timer Demo/Timer Demo/TableViewCell.swift b/Timer Demo/Timer Demo/TableViewCell.swift index 87c6596..b18cc35 100644 --- a/Timer Demo/Timer Demo/TableViewCell.swift +++ b/Timer Demo/Timer Demo/TableViewCell.swift @@ -12,11 +12,12 @@ class TableViewCell: UITableViewCell { @IBOutlet weak var timerLabel: UILabel! @IBOutlet weak var startPauseButton: UIButton! - var timerString : String! + var timer : Timer! override func awakeFromNib() { super.awakeFromNib() - self.timerLabel.text = timerString + +// self.timerLabel.text = String(timer.remainingTime) } override func setSelected(selected: Bool, animated: Bool) { diff --git a/Timer Demo/Timer Demo/ViewController.swift b/Timer Demo/Timer Demo/ViewController.swift index 5d6e539..ed83b2d 100644 --- a/Timer Demo/Timer Demo/ViewController.swift +++ b/Timer Demo/Timer Demo/ViewController.swift @@ -18,6 +18,7 @@ class ViewController: UIViewController, UITableViewDataSource, UITableViewDelega var displayLink : CADisplayLink! var timers: [Timer] = []; let popcornTimer = Timer.init(startTime: 30.000) + let poopTimer = Timer.init(startTime: 45.000) override func viewDidLoad() { super.viewDidLoad() @@ -26,7 +27,7 @@ class ViewController: UIViewController, UITableViewDataSource, UITableViewDelega displayLink.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes) addTimer(popcornTimer) - + addTimer(poopTimer) } func addTimer(timer:Timer){ @@ -51,20 +52,39 @@ class ViewController: UIViewController, UITableViewDataSource, UITableViewDelega func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! TableViewCell - cell.timerLabel.text = String(timers[indexPath.row].remainingTime) + cell.timer = timers[indexPath.row] + + cell.timerLabel.text = String(cell.timer.remainingTime) cell.startPauseButton.tag = indexPath.row - //ADD TARGET. VIDEO @ 9:00 + cell.startPauseButton.addTarget(self, action: "startPause:", forControlEvents: UIControlEvents.TouchUpInside) + return cell } + func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return timers.count } + @IBAction func startPause(sender: UIButton){ + + for path in tableView.indexPathsForVisibleRows! { + let cell = tableView.cellForRowAtIndexPath(path) as! TableViewCell + + if sender.tag == path.row{ + cell.timer.isPaused = true + } + + } + + } + } \ No newline at end of file From 3fa5ee8f4d0cddfd275675df1c8123f65c118c21 Mon Sep 17 00:00:00 2001 From: Derek Date: Sun, 23 Aug 2015 12:19:29 -0400 Subject: [PATCH 23/79] p --- .../Name Picker.xcodeproj/project.pbxproj | 426 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + Name Picker/Name Picker/AppDelegate.swift | 46 ++ .../Name Picker/Base.lproj/LaunchScreen.xib | 41 ++ .../Name Picker/Base.lproj/Main.storyboard | 25 + .../AppIcon.appiconset/Contents.json | 68 +++ Name Picker/Name Picker/Info.plist | 47 ++ Name Picker/Name Picker/ViewController.swift | 25 + Name Picker/Name PickerTests/Info.plist | 24 + .../Name PickerTests/Name_PickerTests.swift | 36 ++ 10 files changed, 745 insertions(+) create mode 100644 Name Picker/Name Picker.xcodeproj/project.pbxproj create mode 100644 Name Picker/Name Picker.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Name Picker/Name Picker/AppDelegate.swift create mode 100644 Name Picker/Name Picker/Base.lproj/LaunchScreen.xib create mode 100644 Name Picker/Name Picker/Base.lproj/Main.storyboard create mode 100644 Name Picker/Name Picker/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Name Picker/Name Picker/Info.plist create mode 100644 Name Picker/Name Picker/ViewController.swift create mode 100644 Name Picker/Name PickerTests/Info.plist create mode 100644 Name Picker/Name PickerTests/Name_PickerTests.swift diff --git a/Name Picker/Name Picker.xcodeproj/project.pbxproj b/Name Picker/Name Picker.xcodeproj/project.pbxproj new file mode 100644 index 0000000..06047ae --- /dev/null +++ b/Name Picker/Name Picker.xcodeproj/project.pbxproj @@ -0,0 +1,426 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 69C400011B8A138D007A59D0 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 69C400001B8A138D007A59D0 /* Images.xcassets */; }; + 69C400041B8A138D007A59D0 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 69C400021B8A138D007A59D0 /* LaunchScreen.xib */; }; + 69C400101B8A138D007A59D0 /* Name_PickerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69C4000F1B8A138D007A59D0 /* Name_PickerTests.swift */; }; + 69C4FFFA1B8A138D007A59D0 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69C4FFF91B8A138D007A59D0 /* AppDelegate.swift */; }; + 69C4FFFC1B8A138D007A59D0 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69C4FFFB1B8A138D007A59D0 /* ViewController.swift */; }; + 69C4FFFF1B8A138D007A59D0 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 69C4FFFD1B8A138D007A59D0 /* Main.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 69C4000A1B8A138D007A59D0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 69C4FFEC1B8A138D007A59D0 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 69C4FFF31B8A138D007A59D0; + remoteInfo = "Name Picker"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 69C400001B8A138D007A59D0 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 69C400031B8A138D007A59D0 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; + 69C400091B8A138D007A59D0 /* Name PickerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Name PickerTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 69C4000E1B8A138D007A59D0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 69C4000F1B8A138D007A59D0 /* Name_PickerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Name_PickerTests.swift; sourceTree = ""; }; + 69C4FFF41B8A138D007A59D0 /* Name Picker.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Name Picker.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 69C4FFF81B8A138D007A59D0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 69C4FFF91B8A138D007A59D0 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 69C4FFFB1B8A138D007A59D0 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 69C4FFFE1B8A138D007A59D0 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 69C400061B8A138D007A59D0 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 69C4FFF11B8A138D007A59D0 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 69C4000C1B8A138D007A59D0 /* Name PickerTests */ = { + isa = PBXGroup; + children = ( + 69C4000F1B8A138D007A59D0 /* Name_PickerTests.swift */, + 69C4000D1B8A138D007A59D0 /* Supporting Files */, + ); + path = "Name PickerTests"; + sourceTree = ""; + }; + 69C4000D1B8A138D007A59D0 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 69C4000E1B8A138D007A59D0 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 69C4FFEB1B8A138D007A59D0 = { + isa = PBXGroup; + children = ( + 69C4FFF61B8A138D007A59D0 /* Name Picker */, + 69C4000C1B8A138D007A59D0 /* Name PickerTests */, + 69C4FFF51B8A138D007A59D0 /* Products */, + ); + sourceTree = ""; + }; + 69C4FFF51B8A138D007A59D0 /* Products */ = { + isa = PBXGroup; + children = ( + 69C4FFF41B8A138D007A59D0 /* Name Picker.app */, + 69C400091B8A138D007A59D0 /* Name PickerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 69C4FFF61B8A138D007A59D0 /* Name Picker */ = { + isa = PBXGroup; + children = ( + 69C4FFF91B8A138D007A59D0 /* AppDelegate.swift */, + 69C4FFFB1B8A138D007A59D0 /* ViewController.swift */, + 69C4FFFD1B8A138D007A59D0 /* Main.storyboard */, + 69C400001B8A138D007A59D0 /* Images.xcassets */, + 69C400021B8A138D007A59D0 /* LaunchScreen.xib */, + 69C4FFF71B8A138D007A59D0 /* Supporting Files */, + ); + path = "Name Picker"; + sourceTree = ""; + }; + 69C4FFF71B8A138D007A59D0 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 69C4FFF81B8A138D007A59D0 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 69C400081B8A138D007A59D0 /* Name PickerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 69C400161B8A138D007A59D0 /* Build configuration list for PBXNativeTarget "Name PickerTests" */; + buildPhases = ( + 69C400051B8A138D007A59D0 /* Sources */, + 69C400061B8A138D007A59D0 /* Frameworks */, + 69C400071B8A138D007A59D0 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 69C4000B1B8A138D007A59D0 /* PBXTargetDependency */, + ); + name = "Name PickerTests"; + productName = "Name PickerTests"; + productReference = 69C400091B8A138D007A59D0 /* Name PickerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 69C4FFF31B8A138D007A59D0 /* Name Picker */ = { + isa = PBXNativeTarget; + buildConfigurationList = 69C400131B8A138D007A59D0 /* Build configuration list for PBXNativeTarget "Name Picker" */; + buildPhases = ( + 69C4FFF01B8A138D007A59D0 /* Sources */, + 69C4FFF11B8A138D007A59D0 /* Frameworks */, + 69C4FFF21B8A138D007A59D0 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Name Picker"; + productName = "Name Picker"; + productReference = 69C4FFF41B8A138D007A59D0 /* Name Picker.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 69C4FFEC1B8A138D007A59D0 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0640; + ORGANIZATIONNAME = dereknetto; + TargetAttributes = { + 69C400081B8A138D007A59D0 = { + CreatedOnToolsVersion = 6.4; + TestTargetID = 69C4FFF31B8A138D007A59D0; + }; + 69C4FFF31B8A138D007A59D0 = { + CreatedOnToolsVersion = 6.4; + }; + }; + }; + buildConfigurationList = 69C4FFEF1B8A138D007A59D0 /* Build configuration list for PBXProject "Name Picker" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 69C4FFEB1B8A138D007A59D0; + productRefGroup = 69C4FFF51B8A138D007A59D0 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 69C4FFF31B8A138D007A59D0 /* Name Picker */, + 69C400081B8A138D007A59D0 /* Name PickerTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 69C400071B8A138D007A59D0 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 69C4FFF21B8A138D007A59D0 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 69C4FFFF1B8A138D007A59D0 /* Main.storyboard in Resources */, + 69C400041B8A138D007A59D0 /* LaunchScreen.xib in Resources */, + 69C400011B8A138D007A59D0 /* Images.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 69C400051B8A138D007A59D0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 69C400101B8A138D007A59D0 /* Name_PickerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 69C4FFF01B8A138D007A59D0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 69C4FFFC1B8A138D007A59D0 /* ViewController.swift in Sources */, + 69C4FFFA1B8A138D007A59D0 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 69C4000B1B8A138D007A59D0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 69C4FFF31B8A138D007A59D0 /* Name Picker */; + targetProxy = 69C4000A1B8A138D007A59D0 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 69C400021B8A138D007A59D0 /* LaunchScreen.xib */ = { + isa = PBXVariantGroup; + children = ( + 69C400031B8A138D007A59D0 /* Base */, + ); + name = LaunchScreen.xib; + sourceTree = ""; + }; + 69C4FFFD1B8A138D007A59D0 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 69C4FFFE1B8A138D007A59D0 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 69C400111B8A138D007A59D0 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + 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 = 8.4; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 69C400121B8A138D007A59D0 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "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 = gnu99; + 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 = 8.4; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 69C400141B8A138D007A59D0 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = "Name Picker/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 69C400151B8A138D007A59D0 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = "Name Picker/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 69C400171B8A138D007A59D0 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = "Name PickerTests/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Name Picker.app/Name Picker"; + }; + name = Debug; + }; + 69C400181B8A138D007A59D0 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + INFOPLIST_FILE = "Name PickerTests/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Name Picker.app/Name Picker"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 69C400131B8A138D007A59D0 /* Build configuration list for PBXNativeTarget "Name Picker" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 69C400141B8A138D007A59D0 /* Debug */, + 69C400151B8A138D007A59D0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; + 69C400161B8A138D007A59D0 /* Build configuration list for PBXNativeTarget "Name PickerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 69C400171B8A138D007A59D0 /* Debug */, + 69C400181B8A138D007A59D0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; + 69C4FFEF1B8A138D007A59D0 /* Build configuration list for PBXProject "Name Picker" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 69C400111B8A138D007A59D0 /* Debug */, + 69C400121B8A138D007A59D0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 69C4FFEC1B8A138D007A59D0 /* Project object */; +} diff --git a/Name Picker/Name Picker.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Name Picker/Name Picker.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..5af2127 --- /dev/null +++ b/Name Picker/Name Picker.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Name Picker/Name Picker/AppDelegate.swift b/Name Picker/Name Picker/AppDelegate.swift new file mode 100644 index 0000000..5f62df3 --- /dev/null +++ b/Name Picker/Name Picker/AppDelegate.swift @@ -0,0 +1,46 @@ +// +// AppDelegate.swift +// Name Picker +// +// Created by Z on 8/23/15. +// Copyright (c) 2015 dereknetto. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + + func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { + // Override point for customization after application launch. + return true + } + + func applicationWillResignActive(application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(application: UIApplication) { + // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + +} + diff --git a/Name Picker/Name Picker/Base.lproj/LaunchScreen.xib b/Name Picker/Name Picker/Base.lproj/LaunchScreen.xib new file mode 100644 index 0000000..e257012 --- /dev/null +++ b/Name Picker/Name Picker/Base.lproj/LaunchScreen.xib @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Name Picker/Name Picker/Base.lproj/Main.storyboard b/Name Picker/Name Picker/Base.lproj/Main.storyboard new file mode 100644 index 0000000..3a2a49b --- /dev/null +++ b/Name Picker/Name Picker/Base.lproj/Main.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Name Picker/Name Picker/Images.xcassets/AppIcon.appiconset/Contents.json b/Name Picker/Name Picker/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..36d2c80 --- /dev/null +++ b/Name Picker/Name Picker/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "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" : "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" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Name Picker/Name Picker/Info.plist b/Name Picker/Name Picker/Info.plist new file mode 100644 index 0000000..47029f1 --- /dev/null +++ b/Name Picker/Name Picker/Info.plist @@ -0,0 +1,47 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + nyc.c4q.Derek316x.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Name Picker/Name Picker/ViewController.swift b/Name Picker/Name Picker/ViewController.swift new file mode 100644 index 0000000..e3133bf --- /dev/null +++ b/Name Picker/Name Picker/ViewController.swift @@ -0,0 +1,25 @@ +// +// ViewController.swift +// Name Picker +// +// Created by Z on 8/23/15. +// Copyright (c) 2015 dereknetto. 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. + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + +} + diff --git a/Name Picker/Name PickerTests/Info.plist b/Name Picker/Name PickerTests/Info.plist new file mode 100644 index 0000000..9317714 --- /dev/null +++ b/Name Picker/Name PickerTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + nyc.c4q.Derek316x.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/Name Picker/Name PickerTests/Name_PickerTests.swift b/Name Picker/Name PickerTests/Name_PickerTests.swift new file mode 100644 index 0000000..da0cdc6 --- /dev/null +++ b/Name Picker/Name PickerTests/Name_PickerTests.swift @@ -0,0 +1,36 @@ +// +// Name_PickerTests.swift +// Name PickerTests +// +// Created by Z on 8/23/15. +// Copyright (c) 2015 dereknetto. All rights reserved. +// + +import UIKit +import XCTest + +class Name_PickerTests: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // This is an example of a functional test case. + XCTAssert(true, "Pass") + } + + func testPerformanceExample() { + // This is an example of a performance test case. + self.measureBlock() { + // Put the code you want to measure the time of here. + } + } + +} From 36752f1468daa19c7b470ef3546ba63e8314edfd Mon Sep 17 00:00:00 2001 From: Derek Date: Sun, 23 Aug 2015 12:19:57 -0400 Subject: [PATCH 24/79] v --- .../Name Picker.xcodeproj/project.pbxproj | 426 ------------------ .../contents.xcworkspacedata | 7 - Name Picker/Name Picker/AppDelegate.swift | 46 -- .../Name Picker/Base.lproj/LaunchScreen.xib | 41 -- .../Name Picker/Base.lproj/Main.storyboard | 25 - .../AppIcon.appiconset/Contents.json | 68 --- Name Picker/Name Picker/Info.plist | 47 -- Name Picker/Name Picker/ViewController.swift | 25 - Name Picker/Name PickerTests/Info.plist | 24 - .../Name PickerTests/Name_PickerTests.swift | 36 -- Stopwatch/Stopwatch.xcodeproj/project.pbxproj | 4 + .../Stopwatch/Base.lproj/Main.storyboard | 15 +- Stopwatch/Stopwatch/ViewController.swift | 3 +- .../Base.lproj/LaunchScreen.storyboard | 4 +- .../Timer Demo/Base.lproj/Main.storyboard | 2 +- 15 files changed, 13 insertions(+), 760 deletions(-) delete mode 100644 Name Picker/Name Picker.xcodeproj/project.pbxproj delete mode 100644 Name Picker/Name Picker.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 Name Picker/Name Picker/AppDelegate.swift delete mode 100644 Name Picker/Name Picker/Base.lproj/LaunchScreen.xib delete mode 100644 Name Picker/Name Picker/Base.lproj/Main.storyboard delete mode 100644 Name Picker/Name Picker/Images.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 Name Picker/Name Picker/Info.plist delete mode 100644 Name Picker/Name Picker/ViewController.swift delete mode 100644 Name Picker/Name PickerTests/Info.plist delete mode 100644 Name Picker/Name PickerTests/Name_PickerTests.swift diff --git a/Name Picker/Name Picker.xcodeproj/project.pbxproj b/Name Picker/Name Picker.xcodeproj/project.pbxproj deleted file mode 100644 index 06047ae..0000000 --- a/Name Picker/Name Picker.xcodeproj/project.pbxproj +++ /dev/null @@ -1,426 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 69C400011B8A138D007A59D0 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 69C400001B8A138D007A59D0 /* Images.xcassets */; }; - 69C400041B8A138D007A59D0 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 69C400021B8A138D007A59D0 /* LaunchScreen.xib */; }; - 69C400101B8A138D007A59D0 /* Name_PickerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69C4000F1B8A138D007A59D0 /* Name_PickerTests.swift */; }; - 69C4FFFA1B8A138D007A59D0 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69C4FFF91B8A138D007A59D0 /* AppDelegate.swift */; }; - 69C4FFFC1B8A138D007A59D0 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69C4FFFB1B8A138D007A59D0 /* ViewController.swift */; }; - 69C4FFFF1B8A138D007A59D0 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 69C4FFFD1B8A138D007A59D0 /* Main.storyboard */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 69C4000A1B8A138D007A59D0 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 69C4FFEC1B8A138D007A59D0 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 69C4FFF31B8A138D007A59D0; - remoteInfo = "Name Picker"; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 69C400001B8A138D007A59D0 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; - 69C400031B8A138D007A59D0 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; - 69C400091B8A138D007A59D0 /* Name PickerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Name PickerTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 69C4000E1B8A138D007A59D0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 69C4000F1B8A138D007A59D0 /* Name_PickerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Name_PickerTests.swift; sourceTree = ""; }; - 69C4FFF41B8A138D007A59D0 /* Name Picker.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Name Picker.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - 69C4FFF81B8A138D007A59D0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 69C4FFF91B8A138D007A59D0 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 69C4FFFB1B8A138D007A59D0 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - 69C4FFFE1B8A138D007A59D0 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 69C400061B8A138D007A59D0 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 69C4FFF11B8A138D007A59D0 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 69C4000C1B8A138D007A59D0 /* Name PickerTests */ = { - isa = PBXGroup; - children = ( - 69C4000F1B8A138D007A59D0 /* Name_PickerTests.swift */, - 69C4000D1B8A138D007A59D0 /* Supporting Files */, - ); - path = "Name PickerTests"; - sourceTree = ""; - }; - 69C4000D1B8A138D007A59D0 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 69C4000E1B8A138D007A59D0 /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 69C4FFEB1B8A138D007A59D0 = { - isa = PBXGroup; - children = ( - 69C4FFF61B8A138D007A59D0 /* Name Picker */, - 69C4000C1B8A138D007A59D0 /* Name PickerTests */, - 69C4FFF51B8A138D007A59D0 /* Products */, - ); - sourceTree = ""; - }; - 69C4FFF51B8A138D007A59D0 /* Products */ = { - isa = PBXGroup; - children = ( - 69C4FFF41B8A138D007A59D0 /* Name Picker.app */, - 69C400091B8A138D007A59D0 /* Name PickerTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 69C4FFF61B8A138D007A59D0 /* Name Picker */ = { - isa = PBXGroup; - children = ( - 69C4FFF91B8A138D007A59D0 /* AppDelegate.swift */, - 69C4FFFB1B8A138D007A59D0 /* ViewController.swift */, - 69C4FFFD1B8A138D007A59D0 /* Main.storyboard */, - 69C400001B8A138D007A59D0 /* Images.xcassets */, - 69C400021B8A138D007A59D0 /* LaunchScreen.xib */, - 69C4FFF71B8A138D007A59D0 /* Supporting Files */, - ); - path = "Name Picker"; - sourceTree = ""; - }; - 69C4FFF71B8A138D007A59D0 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 69C4FFF81B8A138D007A59D0 /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 69C400081B8A138D007A59D0 /* Name PickerTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 69C400161B8A138D007A59D0 /* Build configuration list for PBXNativeTarget "Name PickerTests" */; - buildPhases = ( - 69C400051B8A138D007A59D0 /* Sources */, - 69C400061B8A138D007A59D0 /* Frameworks */, - 69C400071B8A138D007A59D0 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 69C4000B1B8A138D007A59D0 /* PBXTargetDependency */, - ); - name = "Name PickerTests"; - productName = "Name PickerTests"; - productReference = 69C400091B8A138D007A59D0 /* Name PickerTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 69C4FFF31B8A138D007A59D0 /* Name Picker */ = { - isa = PBXNativeTarget; - buildConfigurationList = 69C400131B8A138D007A59D0 /* Build configuration list for PBXNativeTarget "Name Picker" */; - buildPhases = ( - 69C4FFF01B8A138D007A59D0 /* Sources */, - 69C4FFF11B8A138D007A59D0 /* Frameworks */, - 69C4FFF21B8A138D007A59D0 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "Name Picker"; - productName = "Name Picker"; - productReference = 69C4FFF41B8A138D007A59D0 /* Name Picker.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 69C4FFEC1B8A138D007A59D0 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0640; - ORGANIZATIONNAME = dereknetto; - TargetAttributes = { - 69C400081B8A138D007A59D0 = { - CreatedOnToolsVersion = 6.4; - TestTargetID = 69C4FFF31B8A138D007A59D0; - }; - 69C4FFF31B8A138D007A59D0 = { - CreatedOnToolsVersion = 6.4; - }; - }; - }; - buildConfigurationList = 69C4FFEF1B8A138D007A59D0 /* Build configuration list for PBXProject "Name Picker" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 69C4FFEB1B8A138D007A59D0; - productRefGroup = 69C4FFF51B8A138D007A59D0 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 69C4FFF31B8A138D007A59D0 /* Name Picker */, - 69C400081B8A138D007A59D0 /* Name PickerTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 69C400071B8A138D007A59D0 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 69C4FFF21B8A138D007A59D0 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 69C4FFFF1B8A138D007A59D0 /* Main.storyboard in Resources */, - 69C400041B8A138D007A59D0 /* LaunchScreen.xib in Resources */, - 69C400011B8A138D007A59D0 /* Images.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 69C400051B8A138D007A59D0 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 69C400101B8A138D007A59D0 /* Name_PickerTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 69C4FFF01B8A138D007A59D0 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 69C4FFFC1B8A138D007A59D0 /* ViewController.swift in Sources */, - 69C4FFFA1B8A138D007A59D0 /* AppDelegate.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 69C4000B1B8A138D007A59D0 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 69C4FFF31B8A138D007A59D0 /* Name Picker */; - targetProxy = 69C4000A1B8A138D007A59D0 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 69C400021B8A138D007A59D0 /* LaunchScreen.xib */ = { - isa = PBXVariantGroup; - children = ( - 69C400031B8A138D007A59D0 /* Base */, - ); - name = LaunchScreen.xib; - sourceTree = ""; - }; - 69C4FFFD1B8A138D007A59D0 /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 69C4FFFE1B8A138D007A59D0 /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 69C400111B8A138D007A59D0 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - 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 = 8.4; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 69C400121B8A138D007A59D0 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "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 = gnu99; - 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 = 8.4; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 69C400141B8A138D007A59D0 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - INFOPLIST_FILE = "Name Picker/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 69C400151B8A138D007A59D0 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - INFOPLIST_FILE = "Name Picker/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; - 69C400171B8A138D007A59D0 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = "Name PickerTests/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Name Picker.app/Name Picker"; - }; - name = Debug; - }; - 69C400181B8A138D007A59D0 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); - INFOPLIST_FILE = "Name PickerTests/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Name Picker.app/Name Picker"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 69C400131B8A138D007A59D0 /* Build configuration list for PBXNativeTarget "Name Picker" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 69C400141B8A138D007A59D0 /* Debug */, - 69C400151B8A138D007A59D0 /* Release */, - ); - defaultConfigurationIsVisible = 0; - }; - 69C400161B8A138D007A59D0 /* Build configuration list for PBXNativeTarget "Name PickerTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 69C400171B8A138D007A59D0 /* Debug */, - 69C400181B8A138D007A59D0 /* Release */, - ); - defaultConfigurationIsVisible = 0; - }; - 69C4FFEF1B8A138D007A59D0 /* Build configuration list for PBXProject "Name Picker" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 69C400111B8A138D007A59D0 /* Debug */, - 69C400121B8A138D007A59D0 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 69C4FFEC1B8A138D007A59D0 /* Project object */; -} diff --git a/Name Picker/Name Picker.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Name Picker/Name Picker.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 5af2127..0000000 --- a/Name Picker/Name Picker.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/Name Picker/Name Picker/AppDelegate.swift b/Name Picker/Name Picker/AppDelegate.swift deleted file mode 100644 index 5f62df3..0000000 --- a/Name Picker/Name Picker/AppDelegate.swift +++ /dev/null @@ -1,46 +0,0 @@ -// -// AppDelegate.swift -// Name Picker -// -// Created by Z on 8/23/15. -// Copyright (c) 2015 dereknetto. All rights reserved. -// - -import UIKit - -@UIApplicationMain -class AppDelegate: UIResponder, UIApplicationDelegate { - - var window: UIWindow? - - - func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { - // Override point for customization after application launch. - return true - } - - func applicationWillResignActive(application: UIApplication) { - // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. - } - - func applicationDidEnterBackground(application: UIApplication) { - // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. - } - - func applicationWillEnterForeground(application: UIApplication) { - // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. - } - - func applicationDidBecomeActive(application: UIApplication) { - // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. - } - - func applicationWillTerminate(application: UIApplication) { - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. - } - - -} - diff --git a/Name Picker/Name Picker/Base.lproj/LaunchScreen.xib b/Name Picker/Name Picker/Base.lproj/LaunchScreen.xib deleted file mode 100644 index e257012..0000000 --- a/Name Picker/Name Picker/Base.lproj/LaunchScreen.xib +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Name Picker/Name Picker/Base.lproj/Main.storyboard b/Name Picker/Name Picker/Base.lproj/Main.storyboard deleted file mode 100644 index 3a2a49b..0000000 --- a/Name Picker/Name Picker/Base.lproj/Main.storyboard +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Name Picker/Name Picker/Images.xcassets/AppIcon.appiconset/Contents.json b/Name Picker/Name Picker/Images.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 36d2c80..0000000 --- a/Name Picker/Name Picker/Images.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "images" : [ - { - "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" : "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" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Name Picker/Name Picker/Info.plist b/Name Picker/Name Picker/Info.plist deleted file mode 100644 index 47029f1..0000000 --- a/Name Picker/Name Picker/Info.plist +++ /dev/null @@ -1,47 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - nyc.c4q.Derek316x.$(PRODUCT_NAME:rfc1034identifier) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/Name Picker/Name Picker/ViewController.swift b/Name Picker/Name Picker/ViewController.swift deleted file mode 100644 index e3133bf..0000000 --- a/Name Picker/Name Picker/ViewController.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// ViewController.swift -// Name Picker -// -// Created by Z on 8/23/15. -// Copyright (c) 2015 dereknetto. 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. - } - - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. - } - - -} - diff --git a/Name Picker/Name PickerTests/Info.plist b/Name Picker/Name PickerTests/Info.plist deleted file mode 100644 index 9317714..0000000 --- a/Name Picker/Name PickerTests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - nyc.c4q.Derek316x.$(PRODUCT_NAME:rfc1034identifier) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/Name Picker/Name PickerTests/Name_PickerTests.swift b/Name Picker/Name PickerTests/Name_PickerTests.swift deleted file mode 100644 index da0cdc6..0000000 --- a/Name Picker/Name PickerTests/Name_PickerTests.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// Name_PickerTests.swift -// Name PickerTests -// -// Created by Z on 8/23/15. -// Copyright (c) 2015 dereknetto. All rights reserved. -// - -import UIKit -import XCTest - -class Name_PickerTests: XCTestCase { - - override func setUp() { - super.setUp() - // Put setup code here. This method is called before the invocation of each test method in the class. - } - - override func tearDown() { - // Put teardown code here. This method is called after the invocation of each test method in the class. - super.tearDown() - } - - func testExample() { - // This is an example of a functional test case. - XCTAssert(true, "Pass") - } - - func testPerformanceExample() { - // This is an example of a performance test case. - self.measureBlock() { - // Put the code you want to measure the time of here. - } - } - -} diff --git a/Stopwatch/Stopwatch.xcodeproj/project.pbxproj b/Stopwatch/Stopwatch.xcodeproj/project.pbxproj index 2ffa285..e9c008f 100644 --- a/Stopwatch/Stopwatch.xcodeproj/project.pbxproj +++ b/Stopwatch/Stopwatch.xcodeproj/project.pbxproj @@ -187,6 +187,7 @@ 5028B5221B87DC1F00CB0B34 /* Project object */ = { isa = PBXProject; attributes = { + LastSwiftUpdateCheck = 0700; LastUpgradeCheck = 0700; ORGANIZATIONNAME = "Jovanny Espinal"; TargetAttributes = { @@ -484,6 +485,7 @@ 5028B5541B87DC2000CB0B34 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; 5028B5551B87DC2000CB0B34 /* Build configuration list for PBXNativeTarget "StopwatchTests" */ = { isa = XCConfigurationList; @@ -492,6 +494,7 @@ 5028B5571B87DC2000CB0B34 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; 5028B5581B87DC2000CB0B34 /* Build configuration list for PBXNativeTarget "StopwatchUITests" */ = { isa = XCConfigurationList; @@ -500,6 +503,7 @@ 5028B55A1B87DC2000CB0B34 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; diff --git a/Stopwatch/Stopwatch/Base.lproj/Main.storyboard b/Stopwatch/Stopwatch/Base.lproj/Main.storyboard index e53ef98..1285b59 100644 --- a/Stopwatch/Stopwatch/Base.lproj/Main.storyboard +++ b/Stopwatch/Stopwatch/Base.lproj/Main.storyboard @@ -1,14 +1,9 @@ - + - + - - - HelveticaNeue - - @@ -30,9 +25,9 @@ @@ -54,7 +49,7 @@ - + diff --git a/Stopwatch/Stopwatch/ViewController.swift b/Stopwatch/Stopwatch/ViewController.swift index 17e4d03..cd9da17 100644 --- a/Stopwatch/Stopwatch/ViewController.swift +++ b/Stopwatch/Stopwatch/ViewController.swift @@ -94,9 +94,8 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour //add the time since the last lap to the laps array (refer to the updateStopWatch method) laps.insert(lapString, atIndex: 0) - //Reset the lap counter + //Reset the lap counter and lap string lapElapsedTime = 0 - lapString = "00:00.00" //Refreshes the table view that contains the lap tim diff --git a/Timer Demo/Timer Demo/Base.lproj/LaunchScreen.storyboard b/Timer Demo/Timer Demo/Base.lproj/LaunchScreen.storyboard index ac89b45..4218604 100644 --- a/Timer Demo/Timer Demo/Base.lproj/LaunchScreen.storyboard +++ b/Timer Demo/Timer Demo/Base.lproj/LaunchScreen.storyboard @@ -1,7 +1,7 @@ - + - + diff --git a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard index 1e3f89f..0d382ce 100644 --- a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard +++ b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard @@ -1,5 +1,5 @@ - + From 4421db048cc9d09e64e9d642a2d4779e00798258 Mon Sep 17 00:00:00 2001 From: Derek Date: Sun, 23 Aug 2015 15:08:20 -0400 Subject: [PATCH 25/79] opened it --- Timer Demo/Timer Demo/Base.lproj/Main.storyboard | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard index 0d382ce..032a671 100644 --- a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard +++ b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard @@ -1,7 +1,7 @@ - + From a8295f159dd3f77626a71d908f8b33959031d207 Mon Sep 17 00:00:00 2001 From: Jovanny Espinal Date: Sun, 23 Aug 2015 15:09:39 -0400 Subject: [PATCH 26/79] FIxed time duration --- Stopwatch/Stopwatch/ViewController.swift | 42 +++++++++++++++--------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/Stopwatch/Stopwatch/ViewController.swift b/Stopwatch/Stopwatch/ViewController.swift index cd9da17..960161b 100644 --- a/Stopwatch/Stopwatch/ViewController.swift +++ b/Stopwatch/Stopwatch/ViewController.swift @@ -7,26 +7,29 @@ // import UIKit +import QuartzCore class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { //MARK: Properties - var timer = NSTimer() - var lapTimer = NSTimer() + var timer: CADisplayLink! + var lapTimer: CADisplayLink! var startTime : CFAbsoluteTime = 0 - var elapsedTime : NSTimeInterval = 0 + var elapsedTime : CFAbsoluteTime = 0 var stopwatchString: String = "" var lapStartTime : CFAbsoluteTime = 0 - var lapElapsedTime : NSTimeInterval = 0 + var lapElapsedTime : CFAbsoluteTime = 0 var lapString: String = "" var laps: [String] = [] var isStopped: Bool = true var canAddLaps: Bool = false + var totalTime : CFAbsoluteTime = 0 + @IBOutlet weak var stopwatchLabel: UILabel! @IBOutlet weak var lapsTableView: UITableView! @@ -58,9 +61,13 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour //Allow for laps to be added to the tableView (refer to the lapsReset method) canAddLaps = true - //updateStopwatch method is called every 0.01 seconds - timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: ("updateStopwatch"), userInfo: nil, repeats: true) - lapTimer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: ("updateStopwatch"), userInfo: nil, repeats: true) + //updateStopwatch method + timer = CADisplayLink(target: self, selector: "updateStopwatch") + lapTimer = CADisplayLink(target: self, selector: "updateStopwatch") + + //Add to run loop + timer.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes) + lapTimer.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes) //Update buttons startStopButton.setImage(UIImage(named: "stop.png"), forState: UIControlState.Normal) @@ -76,9 +83,12 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour canAddLaps = false //invalidate the timers when the stopwatch is stopped +// timer.removeFromRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes) +// lapTimer.removeFromRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes) timer.invalidate() lapTimer.invalidate() + print("total time: \(totalTime)") //update buttons startStopButton.setImage(UIImage(named: "start.png"), forState: .Normal) lapsResetButton.setImage(UIImage(named: "reset.png"), forState: .Normal) @@ -113,12 +123,10 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour //change reset button to lap button lapsResetButton.setImage(UIImage(named: "lap.png"), forState: .Normal) - // Reverts all time variables to 0 - elapsedTime = 0 - lapElapsedTime = 0 - lapString = "00:00.00" + totalTime = 0 + //reset the stopwatchString (just the string) back to 0. stopwatchString = "00:00.00" stopwatchLabel.text = stopwatchString @@ -129,13 +137,15 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour func updateStopwatch() { elapsedTime = CFAbsoluteTimeGetCurrent() - startTime - print("elapsed time: \(elapsedTime)") + totalTime += timer.duration / 2.0 + print("Frame Interval: \(timer.frameInterval)") + print("elapsed time: \(totalTime)") lapElapsedTime = CFAbsoluteTimeGetCurrent() - lapStartTime print("lap time: \(lapElapsedTime)") - stopwatchString = stringFromTimeInterval(elapsedTime) + stopwatchString = stringFromTimeInterval(totalTime) stopwatchLabel.text = stopwatchString lapString = stringFromTimeInterval(lapElapsedTime) @@ -148,10 +158,10 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour let seconds = intInterval % 60 let milliseconds = interval - floor(interval) if floor(milliseconds * 100) <= 9{ - print(String(format: "%02d:%02d:0%d", minutes, seconds, floor(milliseconds * 100))) - return String(format: "%02d:%02d:00", minutes, seconds, milliseconds) +// print(String(format: "%02d:%02d:0%d", minutes, seconds, floor(milliseconds * 100))) + return String(format: "%02d:%02d:0%f", minutes, seconds, milliseconds) } - print(String(format: "%02d:%02d:%.f", minutes, seconds, milliseconds * 100)) +// print(String(format: "%02d:%02d:%.f", minutes, seconds, milliseconds * 100)) return String(format: "%02d:%02d:%.f", minutes, seconds, milliseconds * 100) } From 095b9fc89184d91edb50af6fbdd7e389b850698d Mon Sep 17 00:00:00 2001 From: Jovanny Espinal Date: Sun, 23 Aug 2015 15:54:41 -0400 Subject: [PATCH 27/79] test push --- Stopwatch/Stopwatch/ViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Stopwatch/Stopwatch/ViewController.swift b/Stopwatch/Stopwatch/ViewController.swift index 960161b..a9dd833 100644 --- a/Stopwatch/Stopwatch/ViewController.swift +++ b/Stopwatch/Stopwatch/ViewController.swift @@ -159,7 +159,7 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour let milliseconds = interval - floor(interval) if floor(milliseconds * 100) <= 9{ // print(String(format: "%02d:%02d:0%d", minutes, seconds, floor(milliseconds * 100))) - return String(format: "%02d:%02d:0%f", minutes, seconds, milliseconds) + return String(format: "%02d:%02d:00", minutes, seconds, milliseconds) } // print(String(format: "%02d:%02d:%.f", minutes, seconds, milliseconds * 100)) return String(format: "%02d:%02d:%.f", minutes, seconds, milliseconds * 100) From a942d133b11d40e07ded01f469735eae891df3c8 Mon Sep 17 00:00:00 2001 From: Derek Date: Sun, 23 Aug 2015 15:55:28 -0400 Subject: [PATCH 28/79] t --- Stopwatch/Stopwatch/ViewController.swift | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/Stopwatch/Stopwatch/ViewController.swift b/Stopwatch/Stopwatch/ViewController.swift index cd9da17..b950ed2 100644 --- a/Stopwatch/Stopwatch/ViewController.swift +++ b/Stopwatch/Stopwatch/ViewController.swift @@ -139,20 +139,21 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour stopwatchLabel.text = stopwatchString lapString = stringFromTimeInterval(lapElapsedTime) - } func stringFromTimeInterval(interval: CFTimeInterval) -> String { let intInterval = Int(interval) let minutes = (intInterval / 60) % 60 let seconds = intInterval % 60 - let milliseconds = interval - floor(interval) - if floor(milliseconds * 100) <= 9{ - print(String(format: "%02d:%02d:0%d", minutes, seconds, floor(milliseconds * 100))) - return String(format: "%02d:%02d:00", minutes, seconds, milliseconds) - } - print(String(format: "%02d:%02d:%.f", minutes, seconds, milliseconds * 100)) - return String(format: "%02d:%02d:%.f", minutes, seconds, milliseconds * 100) + let milliseconds = Int(floor(((interval - floor(interval)) * 100))) + + let minutesString = minutes > 9 ? "\(minutes)" : "0\(minutes)" + let secondsString = seconds > 9 ? "\(seconds)" : "0\(seconds)" + let millisecondsString = milliseconds > 9 ? "\(milliseconds)" : "0\(milliseconds)" + + let timeString = minutesString + ":" + secondsString + "." + millisecondsString + + return timeString } // MARK: TableView methods From 400f358cf95d0b9f0bb1625444d888b426b693ad Mon Sep 17 00:00:00 2001 From: Jovanny Espinal Date: Sun, 23 Aug 2015 16:20:15 -0400 Subject: [PATCH 29/79] Final Stopwatch --- Stopwatch/Stopwatch/ViewController.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Stopwatch/Stopwatch/ViewController.swift b/Stopwatch/Stopwatch/ViewController.swift index 68a6c10..a789aa3 100644 --- a/Stopwatch/Stopwatch/ViewController.swift +++ b/Stopwatch/Stopwatch/ViewController.swift @@ -122,6 +122,7 @@ class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSour lapsResetButton.setImage(UIImage(named: "lap.png"), forState: .Normal) lapString = "00:00.00" + lapElapsedTime = 0 totalTime = 0 From f3931fd9e2198915a484132cc135a481e36816f8 Mon Sep 17 00:00:00 2001 From: JovannyEspinal Date: Tue, 25 Aug 2015 19:05:44 -0400 Subject: [PATCH 30/79] Committed and added --- .../Timer Demo/Base.lproj/Main.storyboard | 21 +++++++++++----- Timer Demo/Timer Demo/Timer.swift | 2 +- Timer Demo/Timer Demo/ViewController.swift | 25 ++++++++++++++----- 3 files changed, 35 insertions(+), 13 deletions(-) diff --git a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard index 032a671..dd4d9be 100644 --- a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard +++ b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard @@ -1,7 +1,7 @@ - + - + @@ -63,9 +63,13 @@ - @@ -108,7 +112,9 @@ - + + + @@ -118,4 +124,7 @@ + + + diff --git a/Timer Demo/Timer Demo/Timer.swift b/Timer Demo/Timer Demo/Timer.swift index fae24e1..1ecbd6d 100644 --- a/Timer Demo/Timer Demo/Timer.swift +++ b/Timer Demo/Timer Demo/Timer.swift @@ -12,7 +12,7 @@ class Timer: NSObject { var startTime: CFTimeInterval! var remainingTime: CFTimeInterval! - var isPaused = false + var isPaused = true init(startTime:CFTimeInterval){ self.startTime = startTime diff --git a/Timer Demo/Timer Demo/ViewController.swift b/Timer Demo/Timer Demo/ViewController.swift index ed83b2d..d96a8a0 100644 --- a/Timer Demo/Timer Demo/ViewController.swift +++ b/Timer Demo/Timer Demo/ViewController.swift @@ -11,8 +11,8 @@ import QuartzCore class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { - @IBOutlet weak var timerLabel: UILabel! - @IBOutlet weak var startPauseButton: UIButton! +// @IBOutlet weak var timerLabel: UILabel! +// @IBOutlet weak var startPauseButton: UIButton! @IBOutlet weak var tableView: UITableView! var displayLink : CADisplayLink! @@ -45,6 +45,11 @@ class ViewController: UIViewController, UITableViewDataSource, UITableViewDelega if timer.isPaused == false{ updateTimer(timer) } + + else { + timer.remainingTime = timer.startTime + + } } tableView.reloadData() @@ -73,15 +78,23 @@ class ViewController: UIViewController, UITableViewDataSource, UITableViewDelega return timers.count } - @IBAction func startPause(sender: UIButton){ + @IBAction func startPause(startPauseButton: UIButton){ for path in tableView.indexPathsForVisibleRows! { let cell = tableView.cellForRowAtIndexPath(path) as! TableViewCell - if sender.tag == path.row{ - cell.timer.isPaused = true + if startPauseButton.tag == path.row{ + cell.timer.isPaused = !cell.timer.isPaused + + if cell.timer.isPaused == false { + startPauseButton.setImage(UIImage(named: "Cancel-50.png"), forState: .Normal) + } + + else { + startPauseButton.setImage(UIImage(named: "Start-50.png"), forState: .Normal) + } } - + } } From 4d6b673b594fcb89ff4b0a4b0925340a088075cc Mon Sep 17 00:00:00 2001 From: JovannyEspinal Date: Tue, 25 Aug 2015 19:06:29 -0400 Subject: [PATCH 31/79] Committed and added files images --- .../Cancel-50.imageset/Cancel-50.png | Bin 0 -> 973 bytes .../Cancel-50.imageset/Contents.json | 21 ++++++++++++++++++ .../Start-50.imageset/Contents.json | 21 ++++++++++++++++++ .../Start-50.imageset/Start-50.png | Bin 0 -> 560 bytes 4 files changed, 42 insertions(+) create mode 100644 Timer Demo/Timer Demo/Assets.xcassets/Cancel-50.imageset/Cancel-50.png create mode 100644 Timer Demo/Timer Demo/Assets.xcassets/Cancel-50.imageset/Contents.json create mode 100644 Timer Demo/Timer Demo/Assets.xcassets/Start-50.imageset/Contents.json create mode 100644 Timer Demo/Timer Demo/Assets.xcassets/Start-50.imageset/Start-50.png diff --git a/Timer Demo/Timer Demo/Assets.xcassets/Cancel-50.imageset/Cancel-50.png b/Timer Demo/Timer Demo/Assets.xcassets/Cancel-50.imageset/Cancel-50.png new file mode 100644 index 0000000000000000000000000000000000000000..8d27c0ec892ef200146c2b1c30bc2cb21ec1ba3d GIT binary patch literal 973 zcmV;;12X)HP)Px&hed=n!RfjK^Vq2iA`b^Y?On5Mq?}mEritm34%8M8R-mYVRJ4pW;7HVv7%ad1J)Waz=KK#QWl?ND|+~ZINHw z(A3qG3cZ?rBN|e_B%5}era){opao56v&Ou7V)#S6 zW^GkpM>L=XO=z>i9rZdAnQiY{Sq!HWTF`_xG?s$V!JNh?r9GQDh$eHnmyTplvyNZ& zeXbd;rBTs@Hj+VWAy_Uj88NfoEbMVM8qtPEw4%8WZ`4AjultS+Zg3hw2D@=Sf=0BW z`2<*Mb0Zy!ofAg}S4iTm_*o1Yp0VX}`6$`~jc7$P+PiqB5*aRaTTU;q>RlJH+Yo({ z!3JA=d=XuMR_xH8VoaakMH+9XE%qOIA+E`U*rM>3h-S2tLoz4Qz_9BBA3;7gMcT|% zK@Q1+NFpz&c)~@POW)Jvpc(Dtki5?-_oxKGMxad}7YS%45pqZ$OR3zT5{NRPWygHO zq8aTwI5@~E=c!bHBEdy%6@*IAOd{lv7LF-Yh+g4lh;<#=Y$TzbWNJwSzxiYcR7VoT zNfTjGYYq6dT5)M{qmWGWH#b7aHA)b~_o6%mC0`3H!$OG$tB00000NkvXXu0mjfmeat# literal 0 HcmV?d00001 diff --git a/Timer Demo/Timer Demo/Assets.xcassets/Cancel-50.imageset/Contents.json b/Timer Demo/Timer Demo/Assets.xcassets/Cancel-50.imageset/Contents.json new file mode 100644 index 0000000..ddbdc52 --- /dev/null +++ b/Timer Demo/Timer Demo/Assets.xcassets/Cancel-50.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Cancel-50.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Timer Demo/Timer Demo/Assets.xcassets/Start-50.imageset/Contents.json b/Timer Demo/Timer Demo/Assets.xcassets/Start-50.imageset/Contents.json new file mode 100644 index 0000000..69f1e03 --- /dev/null +++ b/Timer Demo/Timer Demo/Assets.xcassets/Start-50.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Start-50.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Timer Demo/Timer Demo/Assets.xcassets/Start-50.imageset/Start-50.png b/Timer Demo/Timer Demo/Assets.xcassets/Start-50.imageset/Start-50.png new file mode 100644 index 0000000000000000000000000000000000000000..32775132dc56ddbd61f06350ec829d5fbb0657a8 GIT binary patch literal 560 zcmV-00?+-4P)Px$>PbXFRA>e5SxZjCFc7T}NURa3K->VftPoe=42UzZVvB%-utF@l<^l+Dhr$Yk z#P>ZShbqZ;7mOiZi-RspMkRUnZHtbxZqa1J~IKZ$@`$cfy@ zQI$(rq(WZeL5^NIfR@hRzzwhmq$1=(PUJ?8=T>wm&^jQ!){Rik!%ssz{q|4vtL?8Z1(Jr-|TOQ#XO=E^U%oCEA%nMcVMcgqiW!b4&52Bj2~7i zPt`z4WLfGK&y?=$K}E1cg37l5=k-R+H?-dyeJM71yl?u5O`$B}Pi+2G&l4g0*9x4i yB3|?`5uRjxy_Nl|Hzs3Z6|f3e1*`%Kt-vpEidhhTd;TK;0000 Date: Tue, 25 Aug 2015 22:07:36 -0400 Subject: [PATCH 32/79] Progress Bar Working --- .../Cancel-50.imageset/Cancel-50.png | Bin 973 -> 0 bytes .../Cancel-50.imageset/Contents.json | 2 +- .../Start-50.imageset/Contents.json | 2 +- .../Start-50.imageset/Start-50.png | Bin 560 -> 0 bytes .../Timer Demo/Base.lproj/Main.storyboard | 55 +++++++++++++++--- Timer Demo/Timer Demo/TableViewCell.swift | 8 ++- Timer Demo/Timer Demo/Timer.swift | 20 ++++++- Timer Demo/Timer Demo/ViewController.swift | 6 +- 8 files changed, 78 insertions(+), 15 deletions(-) delete mode 100644 Timer Demo/Timer Demo/Assets.xcassets/Cancel-50.imageset/Cancel-50.png delete mode 100644 Timer Demo/Timer Demo/Assets.xcassets/Start-50.imageset/Start-50.png diff --git a/Timer Demo/Timer Demo/Assets.xcassets/Cancel-50.imageset/Cancel-50.png b/Timer Demo/Timer Demo/Assets.xcassets/Cancel-50.imageset/Cancel-50.png deleted file mode 100644 index 8d27c0ec892ef200146c2b1c30bc2cb21ec1ba3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 973 zcmV;;12X)HP)Px&hed=n!RfjK^Vq2iA`b^Y?On5Mq?}mEritm34%8M8R-mYVRJ4pW;7HVv7%ad1J)Waz=KK#QWl?ND|+~ZINHw z(A3qG3cZ?rBN|e_B%5}era){opao56v&Ou7V)#S6 zW^GkpM>L=XO=z>i9rZdAnQiY{Sq!HWTF`_xG?s$V!JNh?r9GQDh$eHnmyTplvyNZ& zeXbd;rBTs@Hj+VWAy_Uj88NfoEbMVM8qtPEw4%8WZ`4AjultS+Zg3hw2D@=Sf=0BW z`2<*Mb0Zy!ofAg}S4iTm_*o1Yp0VX}`6$`~jc7$P+PiqB5*aRaTTU;q>RlJH+Yo({ z!3JA=d=XuMR_xH8VoaakMH+9XE%qOIA+E`U*rM>3h-S2tLoz4Qz_9BBA3;7gMcT|% zK@Q1+NFpz&c)~@POW)Jvpc(Dtki5?-_oxKGMxad}7YS%45pqZ$OR3zT5{NRPWygHO zq8aTwI5@~E=c!bHBEdy%6@*IAOd{lv7LF-Yh+g4lh;<#=Y$TzbWNJwSzxiYcR7VoT zNfTjGYYq6dT5)M{qmWGWH#b7aHA)b~_o6%mC0`3H!$OG$tB00000NkvXXu0mjfmeat# diff --git a/Timer Demo/Timer Demo/Assets.xcassets/Cancel-50.imageset/Contents.json b/Timer Demo/Timer Demo/Assets.xcassets/Cancel-50.imageset/Contents.json index ddbdc52..f678f97 100644 --- a/Timer Demo/Timer Demo/Assets.xcassets/Cancel-50.imageset/Contents.json +++ b/Timer Demo/Timer Demo/Assets.xcassets/Cancel-50.imageset/Contents.json @@ -2,7 +2,7 @@ "images" : [ { "idiom" : "universal", - "filename" : "Cancel-50.png", + "filename" : "Cancel-50-2.png", "scale" : "1x" }, { diff --git a/Timer Demo/Timer Demo/Assets.xcassets/Start-50.imageset/Contents.json b/Timer Demo/Timer Demo/Assets.xcassets/Start-50.imageset/Contents.json index 69f1e03..ec6bb4f 100644 --- a/Timer Demo/Timer Demo/Assets.xcassets/Start-50.imageset/Contents.json +++ b/Timer Demo/Timer Demo/Assets.xcassets/Start-50.imageset/Contents.json @@ -2,7 +2,7 @@ "images" : [ { "idiom" : "universal", - "filename" : "Start-50.png", + "filename" : "Start-50-2.png", "scale" : "1x" }, { diff --git a/Timer Demo/Timer Demo/Assets.xcassets/Start-50.imageset/Start-50.png b/Timer Demo/Timer Demo/Assets.xcassets/Start-50.imageset/Start-50.png deleted file mode 100644 index 32775132dc56ddbd61f06350ec829d5fbb0657a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 560 zcmV-00?+-4P)Px$>PbXFRA>e5SxZjCFc7T}NURa3K->VftPoe=42UzZVvB%-utF@l<^l+Dhr$Yk z#P>ZShbqZ;7mOiZi-RspMkRUnZHtbxZqa1J~IKZ$@`$cfy@ zQI$(rq(WZeL5^NIfR@hRzzwhmq$1=(PUJ?8=T>wm&^jQ!){Rik!%ssz{q|4vtL?8Z1(Jr-|TOQ#XO=E^U%oCEA%nMcVMcgqiW!b4&52Bj2~7i zPt`z4WLfGK&y?=$K}E1cg37l5=k-R+H?-dyeJM71yl?u5O`$B}Pi+2G&l4g0*9x4i yB3|?`5uRjxy_Nl|Hzs3Z6|f3e1*`%Kt-vpEidhhTd;TK;0000 - + - - + + - + + + + + + + + + + + + + @@ -113,7 +130,11 @@ - + + + + + @@ -123,6 +144,24 @@ + + + + + + + + + + + + + + + + + + diff --git a/Timer Demo/Timer Demo/TableViewCell.swift b/Timer Demo/Timer Demo/TableViewCell.swift index b18cc35..c7e2358 100644 --- a/Timer Demo/Timer Demo/TableViewCell.swift +++ b/Timer Demo/Timer Demo/TableViewCell.swift @@ -12,12 +12,18 @@ class TableViewCell: UITableViewCell { @IBOutlet weak var timerLabel: UILabel! @IBOutlet weak var startPauseButton: UIButton! + @IBOutlet weak var progressBar: UIProgressView! + + var timer : Timer! + var maxWidth : CGFloat = 0.0 override func awakeFromNib() { super.awakeFromNib() -// self.timerLabel.text = String(timer.remainingTime) + + + } override func setSelected(selected: Bool, animated: Bool) { diff --git a/Timer Demo/Timer Demo/Timer.swift b/Timer Demo/Timer Demo/Timer.swift index 1ecbd6d..4c34baf 100644 --- a/Timer Demo/Timer Demo/Timer.swift +++ b/Timer Demo/Timer Demo/Timer.swift @@ -9,13 +9,29 @@ import UIKit class Timer: NSObject { - + var startTime: CFTimeInterval! var remainingTime: CFTimeInterval! var isPaused = true + init(startTime:CFTimeInterval){ self.startTime = startTime self.remainingTime = startTime - } + } + + func stringFromTimeInterval(interval: CFTimeInterval) -> String{ + let intInterval = Int(interval) + let minutes = (intInterval / 60) % 60 + let seconds = intInterval % 60 + let milliseconds = Int(floor(((interval - floor(interval)) * 100))) + + let minutesString = minutes > 9 ? "\(minutes)" : "0\(minutes)" + let secondsString = seconds > 9 ? "\(seconds)" : "0\(seconds)" + let millisecondsString = milliseconds > 9 ? "\(milliseconds)" : "0\(milliseconds)" + + let timeString = minutesString + ":" + secondsString + "." + millisecondsString + + return timeString + } } diff --git a/Timer Demo/Timer Demo/ViewController.swift b/Timer Demo/Timer Demo/ViewController.swift index d96a8a0..cf5c72f 100644 --- a/Timer Demo/Timer Demo/ViewController.swift +++ b/Timer Demo/Timer Demo/ViewController.swift @@ -48,7 +48,6 @@ class ViewController: UIViewController, UITableViewDataSource, UITableViewDelega else { timer.remainingTime = timer.startTime - } } @@ -62,11 +61,14 @@ class ViewController: UIViewController, UITableViewDataSource, UITableViewDelega cell.timer = timers[indexPath.row] - cell.timerLabel.text = String(cell.timer.remainingTime) + cell.timerLabel.text = String(cell.timer.stringFromTimeInterval(cell.timer.remainingTime)) cell.startPauseButton.tag = indexPath.row cell.startPauseButton.addTarget(self, action: "startPause:", forControlEvents: UIControlEvents.TouchUpInside) + + cell.progressBar.progress = Float((cell.timer.remainingTime/cell.timer.startTime)) + return cell From 1a2e21e22318ae9fc6ada96061c4d0a8c5fe6b20 Mon Sep 17 00:00:00 2001 From: JovannyEspinal Date: Tue, 25 Aug 2015 22:08:01 -0400 Subject: [PATCH 33/79] Changed images and Progress Bar Work --- .../Cancel-50.imageset/Cancel-50-2.png | Bin 0 -> 1763 bytes .../Start-50.imageset/Start-50-2.png | Bin 0 -> 919 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Timer Demo/Timer Demo/Assets.xcassets/Cancel-50.imageset/Cancel-50-2.png create mode 100644 Timer Demo/Timer Demo/Assets.xcassets/Start-50.imageset/Start-50-2.png diff --git a/Timer Demo/Timer Demo/Assets.xcassets/Cancel-50.imageset/Cancel-50-2.png b/Timer Demo/Timer Demo/Assets.xcassets/Cancel-50.imageset/Cancel-50-2.png new file mode 100644 index 0000000000000000000000000000000000000000..86c7fa1a479957dd1dd1f6bcf3ceda9bcc3a29c1 GIT binary patch literal 1763 zcmV<91|0c`P)Px*ok>JNRA>d=np50D1}n` zP!a8$K9$}OUxYrWh($`Nv|h-Am|IbhO3j6)79RwunndhnHz|}-Z(W)_Gk)LMJ=wFH z-SnKz?wWSsWKQP%Xa2u$=FFVAtP~Xprl-f6NzJSi#x!an8l^N*6x%2aF2$GLfKfS zXMYdmIcq!}Z+p}T{U)kn7n166*|`xi=_&xM*7w6*2k5RgJ8hmAkL-h?QLs&$8Ht##Sv#-zz`%M;zXt;bN(<`~7=)nk zouwjzz+@p4*~my%rn@0eh!o5B<2%8x?S=5)p+m0GQi-!n7s!}l&5_N$TGzUpn`~qK zjQ3D!r8ceZJNskKZ0X!x?QVNoX?-4DUR%ndBN2QW4H zC(=LioS#a_OlK@kM(dOj>%)V?Q%;Lu7VJ6@>Mk5n2(%vuv3FdrjpG_2%|sgr`OIbmN38}Xs@eKWj29D1iK&JNa(b8>WU?!UPlB)`1H+-k zi16ku1kXOpj80{AY;W0x_ux+>4U5Vugu<4Ai>iq5qE|(T*FmlBt0JVxs}<-wQ;v8F zN#U}lw{O3{oB|5-6pFCWCwRfG;$pJQ&i)#OBnYGHQtKEmCKMCF{!-Xyf=*{jF?pC1 z5F%Mqm;u^PmCE2Jy_5(yZ#Bf^nB_$XG2?WG4Y*dP|hKX zbQUR?Zz=Aw`wr-|U%|MnkKKGRcAsy@G?emH#~$p|z)=g!Eb$>CjkWL&E+ZWSAAc~n z`4eX299{|LBTJr%N6a{;xjFj#q#Hb@E;>?9Y!zWI(XyE1L*@yTS_6z#2uH33~P>VZl}>rx+gZVDaP65 zHew%cu`!`Ozt+{Z-WBCB8F9ok>Ly6;EV(ZJ=%Jim#6MPDs1=RI*e z?G<#_|6sr?=AQToN1mX&{YN!kF}%O)f96yuXes>g>_6X{#<#2Zjp+aY002ovPDHLk FV1oLdR*V1u literal 0 HcmV?d00001 diff --git a/Timer Demo/Timer Demo/Assets.xcassets/Start-50.imageset/Start-50-2.png b/Timer Demo/Timer Demo/Assets.xcassets/Start-50.imageset/Start-50-2.png new file mode 100644 index 0000000000000000000000000000000000000000..d4931837b6aeecc27d2b7c3062674e6148090c75 GIT binary patch literal 919 zcmV;I18Dq-P)Px&QAtEWRA>e5SxsmYK@^_Zq)|j6E%hoMnxyd`1P_XM(R!$nn1Dx}-Murf?E&-W{h*c&6 z#7f#RI7=Iigc6~MEe$fnDz}mq0qG9$kPQqv=qSfkz9QxNmN_?x7;UM_bEF}Bu6Xb{ zJQ+_>j$L2!Mw1O)Y>SiCzO}Bv7UX6ENp#Ny=H2oB16#yXx4GIxBp~aI(bEDce1eT^ z!kG+pN(!xdO^8_YmM+HF(_(=@=~bG`E<5AFk)tm{Z7oG);o{U<${!mlaNJ=4jwO#B zYN4^r?(9PMY|x_x8BJD10=nXjeB*u5vjSu1K!(+;L#zDJl!!!V*&mzRxoSHIRrN5) z(puz?E<}*f$IFvB-XDF!+H4M}t>G~ZO~w4tjYttV{G>dSKcSKx;E3f2rR)uer2Kg+ z+0@hPPNXVGO4h6DYEY=Uv)AB{;GROWf9}B^6C#XSU{0D5a(~wk+juSWtJ&yA1ox0k zXLgX}vUeai>;R~Mxx#GQZsYA%4PdQuU5GfQ1HBoV9RpCs7a5ovlv#%t{Zn6S1-hA? zrbN1C`}SD`_836)h(MO%&-S$?Z%p-qQWGNkU-ft7Ecv@s5TJ;p=wl-fR&C?>7~U+p z_2@MrlD8IC-~~ZD08%v%{zXs|BH*xHi#*Vg2z>y~d>enP)XxLmi15D1EpUd1?#(zm zdxO+XA`J#m_37nLtzY2bx9VQhzu+2Na=Y@f<+s)cP}=cDvC_y$V-XwHYKT>CB}Cxl zA!s<*%%U(MiLdfy%O(#H3t~cSh*88Uqbm76g3?y~&{MJ^NQD2qcL+XjorK{io}$bk t4Y7kC6_zOYR5SAnk)|dbQ002ovPDHLkV1k11tJ(kn literal 0 HcmV?d00001 From d525bc348a0afe5cd4bd94a4fe2276d047ce767c Mon Sep 17 00:00:00 2001 From: Derek316x Date: Thu, 27 Aug 2015 20:11:58 -0400 Subject: [PATCH 34/79] storyboard fix --- .../Timer Demo/Base.lproj/Main.storyboard | 24 +++++++++++++++---- Timer Demo/Timer Demo/ViewController.swift | 20 ++++++++-------- 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard index 67ee849..6bd2c9d 100644 --- a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard +++ b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard @@ -1,7 +1,7 @@ - + - + @@ -40,7 +40,7 @@ - + @@ -78,22 +78,38 @@ - + + + + + + + + + + + + + + + + + diff --git a/Timer Demo/Timer Demo/ViewController.swift b/Timer Demo/Timer Demo/ViewController.swift index cf5c72f..e3c07cf 100644 --- a/Timer Demo/Timer Demo/ViewController.swift +++ b/Timer Demo/Timer Demo/ViewController.swift @@ -11,15 +11,15 @@ import QuartzCore class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { -// @IBOutlet weak var timerLabel: UILabel! -// @IBOutlet weak var startPauseButton: UIButton! + // @IBOutlet weak var timerLabel: UILabel! + // @IBOutlet weak var startPauseButton: UIButton! @IBOutlet weak var tableView: UITableView! var displayLink : CADisplayLink! var timers: [Timer] = []; let popcornTimer = Timer.init(startTime: 30.000) let poopTimer = Timer.init(startTime: 45.000) - + override func viewDidLoad() { super.viewDidLoad() @@ -37,7 +37,7 @@ class ViewController: UIViewController, UITableViewDataSource, UITableViewDelega func updateTimer(timer:Timer){ timer.remainingTime = timer.remainingTime - displayLink.duration print("Remaining time: \(timer.remainingTime)") - + } func update(){ @@ -45,7 +45,7 @@ class ViewController: UIViewController, UITableViewDataSource, UITableViewDelega if timer.isPaused == false{ updateTimer(timer) } - + else { timer.remainingTime = timer.startTime } @@ -67,9 +67,9 @@ class ViewController: UIViewController, UITableViewDataSource, UITableViewDelega cell.startPauseButton.addTarget(self, action: "startPause:", forControlEvents: UIControlEvents.TouchUpInside) - cell.progressBar.progress = Float((cell.timer.remainingTime/cell.timer.startTime)) - - + cell.progressBar.progress = Float((cell.timer.remainingTime/cell.timer.startTime)) + + return cell } @@ -96,9 +96,9 @@ class ViewController: UIViewController, UITableViewDataSource, UITableViewDelega startPauseButton.setImage(UIImage(named: "Start-50.png"), forState: .Normal) } } - + } - + } From d7e8404e25cdb11dcc63c46d5b4dc11e260161dc Mon Sep 17 00:00:00 2001 From: JovannyEspinal Date: Thu, 27 Aug 2015 22:25:25 -0400 Subject: [PATCH 35/79] Fixed Timer Buttons and Progress Bar --- .../Stopwatch/Base.lproj/Main.storyboard | 153 +-------------- .../Timer Demo.xcodeproj/project.pbxproj | 4 + .../Timer Demo/Base.lproj/Main.storyboard | 182 +++++++++++++++++- .../Timer Demo/StopwatchViewController.swift | 176 +++++++++++++++++ Timer Demo/Timer Demo/ViewController.swift | 31 ++- 5 files changed, 381 insertions(+), 165 deletions(-) create mode 100644 Timer Demo/Timer Demo/StopwatchViewController.swift diff --git a/Stopwatch/Stopwatch/Base.lproj/Main.storyboard b/Stopwatch/Stopwatch/Base.lproj/Main.storyboard index 1285b59..ec82769 100644 --- a/Stopwatch/Stopwatch/Base.lproj/Main.storyboard +++ b/Stopwatch/Stopwatch/Base.lproj/Main.storyboard @@ -1,154 +1,7 @@ - + - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/Timer Demo/Timer Demo.xcodeproj/project.pbxproj b/Timer Demo/Timer Demo.xcodeproj/project.pbxproj index 5830b26..f3e8aaf 100644 --- a/Timer Demo/Timer Demo.xcodeproj/project.pbxproj +++ b/Timer Demo/Timer Demo.xcodeproj/project.pbxproj @@ -8,6 +8,7 @@ /* Begin PBXBuildFile section */ 5016E10C1B89209300C5EFFD /* TableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5016E10B1B89209300C5EFFD /* TableViewCell.swift */; }; + 504DC2291B8FE3E30071A35E /* StopwatchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504DC2281B8FE3E30071A35E /* StopwatchViewController.swift */; }; 6981737C1B88EFF0000D38F2 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6981737B1B88EFF0000D38F2 /* AppDelegate.swift */; }; 6981737E1B88EFF0000D38F2 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6981737D1B88EFF0000D38F2 /* ViewController.swift */; }; 698173811B88EFF0000D38F2 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6981737F1B88EFF0000D38F2 /* Main.storyboard */; }; @@ -37,6 +38,7 @@ /* Begin PBXFileReference section */ 5016E10B1B89209300C5EFFD /* TableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableViewCell.swift; sourceTree = ""; }; + 504DC2281B8FE3E30071A35E /* StopwatchViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StopwatchViewController.swift; sourceTree = ""; }; 698173781B88EFF0000D38F2 /* Timer Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Timer Demo.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 6981737B1B88EFF0000D38F2 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 6981737D1B88EFF0000D38F2 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; @@ -105,6 +107,7 @@ 698173A91B88F28C000D38F2 /* Timer.swift */, 5016E10B1B89209300C5EFFD /* TableViewCell.swift */, 6981737D1B88EFF0000D38F2 /* ViewController.swift */, + 504DC2281B8FE3E30071A35E /* StopwatchViewController.swift */, 6981737F1B88EFF0000D38F2 /* Main.storyboard */, 698173821B88EFF0000D38F2 /* Assets.xcassets */, 698173841B88EFF0000D38F2 /* LaunchScreen.storyboard */, @@ -263,6 +266,7 @@ files = ( 698173AA1B88F28C000D38F2 /* Timer.swift in Sources */, 5016E10C1B89209300C5EFFD /* TableViewCell.swift in Sources */, + 504DC2291B8FE3E30071A35E /* StopwatchViewController.swift in Sources */, 6981737E1B88EFF0000D38F2 /* ViewController.swift in Sources */, 6981737C1B88EFF0000D38F2 /* AppDelegate.swift in Sources */, ); diff --git a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard index 6bd2c9d..3913ba3 100644 --- a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard +++ b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard @@ -1,15 +1,36 @@ - + - + - + + + + + + + + + + + + + + + + + + + + + + @@ -18,7 +39,6 @@ - @@ -40,7 +60,7 @@ - + @@ -178,8 +198,160 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Timer Demo/Timer Demo/StopwatchViewController.swift b/Timer Demo/Timer Demo/StopwatchViewController.swift new file mode 100644 index 0000000..7ab5568 --- /dev/null +++ b/Timer Demo/Timer Demo/StopwatchViewController.swift @@ -0,0 +1,176 @@ +// +// StopwatchViewController.swift +// Timer Demo +// +// Created by Jovanny Espinal on 8/27/15. +// Copyright © 2015 dereknetto. All rights reserved. +// + +import UIKit + +class StopwatchViewController: UIViewController { + + //MARK: Properties + + var timer: CADisplayLink! + var lapTimer: CADisplayLink! + + var startTime : CFAbsoluteTime = 0 + var elapsedTime : CFAbsoluteTime = 0 + var stopwatchString: String = "" + + var lapStartTime : CFAbsoluteTime = 0 + var lapElapsedTime : CFAbsoluteTime = 0 + var lapString: String = "" + + var laps: [String] = [] + var isStopped: Bool = true + var canAddLaps: Bool = false + + var totalTime : CFAbsoluteTime = 0 + + @IBOutlet weak var stopwatchLabel: UILabel! + @IBOutlet weak var lapsTableView: UITableView! + + @IBOutlet weak var startStopButton: UIButton! + @IBOutlet weak var lapsResetButton: UIButton! + + //MARK: Lifecycle methods + + override func viewDidLoad() { + super.viewDidLoad() + + //the stopwatchLabel is set to 00:00.00 + stopwatchLabel.text = "00:00.00" + } + + //MARK: Actions + + @IBAction func startStop(sender: AnyObject) { + + if isStopped == true { //start stopwatch + + //record start time + startTime = CFAbsoluteTimeGetCurrent() + lapStartTime = CFAbsoluteTimeGetCurrent() + + //isStopped is false when the stopwatch is started + isStopped = false + + //Allow for laps to be added to the tableView (refer to the lapsReset method) + canAddLaps = true + + //updateStopwatch method + timer = CADisplayLink(target: self, selector: "updateStopwatch") + lapTimer = CADisplayLink(target: self, selector: "updateLap") + + //Add to run loop + timer.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes) + lapTimer.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes) + + //Update buttons + startStopButton.setImage(UIImage(named: "stop.png"), forState: UIControlState.Normal) + lapsResetButton.setImage(UIImage(named: "lap.png"), forState: UIControlState.Normal) + } + + else { //stop stopwatch + + //isStopped is true when the stopwatch is stopped + isStopped = true + + //prevent laps from being added to tableView (refer to the lapsReset method) + canAddLaps = false + + //invalidate the timers when the stopwatch is stopped + timer.invalidate() + lapTimer.invalidate() + + print("total time: \(totalTime)") + //update buttons + startStopButton.setImage(UIImage(named: "start.png"), forState: .Normal) + lapsResetButton.setImage(UIImage(named: "reset.png"), forState: .Normal) + } + + } + + @IBAction func lapsReset(sender: AnyObject) { + + if canAddLaps == true { //add lap + + lapStartTime = CFAbsoluteTimeGetCurrent() + //add the time since the last lap to the laps array (refer to the updateStopWatch method) + laps.insert(lapString, atIndex: 0) + + //Reset the lap counter and lap string + lapElapsedTime = 0 + lapString = "00:00.00" + + //Refreshes the table view that contains the lap tim + lapsTableView.reloadData() + } + + else { //reset + + //remove all elements in the laps array + laps.removeAll(keepCapacity: false) + + //Refreshes the table view that contains the lap times + lapsTableView.reloadData() + + //change reset button to lap button + lapsResetButton.setImage(UIImage(named: "lap.png"), forState: .Normal) + + lapString = "00:00.00" + lapElapsedTime = 0 + + totalTime = 0 + + //reset the stopwatchString (just the string) back to 0. + stopwatchString = "00:00.00" + stopwatchLabel.text = stopwatchString + } + } + + //MARK: Update methods + func updateStopwatch() { + totalTime += timer.duration + stopwatchString = stringFromTimeInterval(totalTime) + + stopwatchLabel.text = stopwatchString + + } + + func updateLap(){ + lapElapsedTime += lapTimer.duration + lapString = stringFromTimeInterval(lapElapsedTime) + } + + func stringFromTimeInterval(interval: CFTimeInterval) -> String { + let intInterval = Int(interval) + let minutes = (intInterval / 60) % 60 + let seconds = intInterval % 60 + let milliseconds = Int(floor(((interval - floor(interval)) * 100))) + + let minutesString = minutes > 9 ? "\(minutes)" : "0\(minutes)" + let secondsString = seconds > 9 ? "\(seconds)" : "0\(seconds)" + let millisecondsString = milliseconds > 9 ? "\(milliseconds)" : "0\(milliseconds)" + + let timeString = minutesString + ":" + secondsString + "." + millisecondsString + + return timeString + } + + // MARK: TableView methods + + func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + let cell = UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: "Cell") + cell.backgroundColor = self.view.backgroundColor + cell.textLabel!.text = "Lap \(laps.count - indexPath.row)" + cell.detailTextLabel?.text = laps[indexPath.row] + return cell + } + + func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return laps.count + } +} diff --git a/Timer Demo/Timer Demo/ViewController.swift b/Timer Demo/Timer Demo/ViewController.swift index e3c07cf..51b3e5d 100644 --- a/Timer Demo/Timer Demo/ViewController.swift +++ b/Timer Demo/Timer Demo/ViewController.swift @@ -17,7 +17,7 @@ class ViewController: UIViewController, UITableViewDataSource, UITableViewDelega var displayLink : CADisplayLink! var timers: [Timer] = []; - let popcornTimer = Timer.init(startTime: 30.000) + let popcornTimer = Timer.init(startTime: 5.000) let poopTimer = Timer.init(startTime: 45.000) override func viewDidLoad() { @@ -35,6 +35,7 @@ class ViewController: UIViewController, UITableViewDataSource, UITableViewDelega } func updateTimer(timer:Timer){ + timer.remainingTime = timer.remainingTime - displayLink.duration print("Remaining time: \(timer.remainingTime)") @@ -42,16 +43,19 @@ class ViewController: UIViewController, UITableViewDataSource, UITableViewDelega func update(){ for timer in timers{ + if timer.isPaused == false{ updateTimer(timer) + if (timer.remainingTime < 0.0){ + timer.isPaused = true; + timer.remainingTime = timer.startTime +// startPauseButton.setImage(UIImage(named: "Start-50.png"), forState: .Normal) + + } } - - else { - timer.remainingTime = timer.startTime - } + + tableView.reloadData() } - - tableView.reloadData() } @@ -59,18 +63,25 @@ class ViewController: UIViewController, UITableViewDataSource, UITableViewDelega let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! TableViewCell - cell.timer = timers[indexPath.row] + let timer = timers[indexPath.row] + + cell.timer = timer cell.timerLabel.text = String(cell.timer.stringFromTimeInterval(cell.timer.remainingTime)) + if timer.isPaused { + cell.startPauseButton.setImage(UIImage(named: "Start-50.png"), forState: .Normal) + } + else { + cell.startPauseButton.setImage(UIImage(named: "Cancel-50.png"), forState: .Normal) + } + cell.startPauseButton.tag = indexPath.row cell.startPauseButton.addTarget(self, action: "startPause:", forControlEvents: UIControlEvents.TouchUpInside) cell.progressBar.progress = Float((cell.timer.remainingTime/cell.timer.startTime)) - - return cell } From 02051a13dd895b453fd5de450cdc1263383c1a42 Mon Sep 17 00:00:00 2001 From: JovannyEspinal Date: Fri, 28 Aug 2015 12:07:14 -0400 Subject: [PATCH 36/79] Refactored some code in Timer View Controller --- .../Timer Demo/Base.lproj/Main.storyboard | 2 +- Timer Demo/Timer Demo/ViewController.swift | 18 +++--------------- 2 files changed, 4 insertions(+), 16 deletions(-) diff --git a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard index 3913ba3..0ba4bef 100644 --- a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard +++ b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard @@ -23,7 +23,7 @@ - + diff --git a/Timer Demo/Timer Demo/ViewController.swift b/Timer Demo/Timer Demo/ViewController.swift index 51b3e5d..b1f4c19 100644 --- a/Timer Demo/Timer Demo/ViewController.swift +++ b/Timer Demo/Timer Demo/ViewController.swift @@ -47,10 +47,7 @@ class ViewController: UIViewController, UITableViewDataSource, UITableViewDelega if timer.isPaused == false{ updateTimer(timer) if (timer.remainingTime < 0.0){ - timer.isPaused = true; - timer.remainingTime = timer.startTime -// startPauseButton.setImage(UIImage(named: "Start-50.png"), forState: .Normal) - + timer.isPaused = true } } @@ -71,6 +68,7 @@ class ViewController: UIViewController, UITableViewDataSource, UITableViewDelega if timer.isPaused { cell.startPauseButton.setImage(UIImage(named: "Start-50.png"), forState: .Normal) + cell.timer.remainingTime = cell.timer.startTime } else { cell.startPauseButton.setImage(UIImage(named: "Cancel-50.png"), forState: .Normal) @@ -96,20 +94,10 @@ class ViewController: UIViewController, UITableViewDataSource, UITableViewDelega for path in tableView.indexPathsForVisibleRows! { let cell = tableView.cellForRowAtIndexPath(path) as! TableViewCell - if startPauseButton.tag == path.row{ + if startPauseButton.tag == path.row { cell.timer.isPaused = !cell.timer.isPaused - - if cell.timer.isPaused == false { - startPauseButton.setImage(UIImage(named: "Cancel-50.png"), forState: .Normal) - } - - else { - startPauseButton.setImage(UIImage(named: "Start-50.png"), forState: .Normal) - } } - } - } From 687f1f0667099431b2646bda9161754b79fce3bc Mon Sep 17 00:00:00 2001 From: JovannyEspinal Date: Sat, 29 Aug 2015 11:47:15 -0400 Subject: [PATCH 37/79] Added alarm and Alert Controller --- .../Timer Demo.xcodeproj/project.pbxproj | 8 +++++ Timer Demo/Timer Demo/ViewController.swift | 31 ++++++++++++++++++- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/Timer Demo/Timer Demo.xcodeproj/project.pbxproj b/Timer Demo/Timer Demo.xcodeproj/project.pbxproj index f3e8aaf..af1b925 100644 --- a/Timer Demo/Timer Demo.xcodeproj/project.pbxproj +++ b/Timer Demo/Timer Demo.xcodeproj/project.pbxproj @@ -9,6 +9,8 @@ /* Begin PBXBuildFile section */ 5016E10C1B89209300C5EFFD /* TableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5016E10B1B89209300C5EFFD /* TableViewCell.swift */; }; 504DC2291B8FE3E30071A35E /* StopwatchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504DC2281B8FE3E30071A35E /* StopwatchViewController.swift */; }; + 504DC22B1B91FD8A0071A35E /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 504DC22A1B91FD8A0071A35E /* AVFoundation.framework */; }; + 504DC22D1B91FE9F0071A35E /* LoudAlarmClockBuzzer.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = 504DC22C1B91FE9F0071A35E /* LoudAlarmClockBuzzer.mp3 */; }; 6981737C1B88EFF0000D38F2 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6981737B1B88EFF0000D38F2 /* AppDelegate.swift */; }; 6981737E1B88EFF0000D38F2 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6981737D1B88EFF0000D38F2 /* ViewController.swift */; }; 698173811B88EFF0000D38F2 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6981737F1B88EFF0000D38F2 /* Main.storyboard */; }; @@ -39,6 +41,8 @@ /* Begin PBXFileReference section */ 5016E10B1B89209300C5EFFD /* TableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableViewCell.swift; sourceTree = ""; }; 504DC2281B8FE3E30071A35E /* StopwatchViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StopwatchViewController.swift; sourceTree = ""; }; + 504DC22A1B91FD8A0071A35E /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; + 504DC22C1B91FE9F0071A35E /* LoudAlarmClockBuzzer.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; name = LoudAlarmClockBuzzer.mp3; path = ../../../../../../../../Downloads/LoudAlarmClockBuzzer.mp3; sourceTree = ""; }; 698173781B88EFF0000D38F2 /* Timer Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Timer Demo.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 6981737B1B88EFF0000D38F2 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 6981737D1B88EFF0000D38F2 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; @@ -60,6 +64,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 504DC22B1B91FD8A0071A35E /* AVFoundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -83,6 +88,7 @@ 6981736F1B88EFF0000D38F2 = { isa = PBXGroup; children = ( + 504DC22A1B91FD8A0071A35E /* AVFoundation.framework */, 6981737A1B88EFF0000D38F2 /* Timer Demo */, 6981738F1B88EFF0000D38F2 /* Timer DemoTests */, 6981739A1B88EFF0000D38F2 /* Timer DemoUITests */, @@ -103,6 +109,7 @@ 6981737A1B88EFF0000D38F2 /* Timer Demo */ = { isa = PBXGroup; children = ( + 504DC22C1B91FE9F0071A35E /* LoudAlarmClockBuzzer.mp3 */, 6981737B1B88EFF0000D38F2 /* AppDelegate.swift */, 698173A91B88F28C000D38F2 /* Timer.swift */, 5016E10B1B89209300C5EFFD /* TableViewCell.swift */, @@ -238,6 +245,7 @@ buildActionMask = 2147483647; files = ( 698173861B88EFF0000D38F2 /* LaunchScreen.storyboard in Resources */, + 504DC22D1B91FE9F0071A35E /* LoudAlarmClockBuzzer.mp3 in Resources */, 698173831B88EFF0000D38F2 /* Assets.xcassets in Resources */, 698173811B88EFF0000D38F2 /* Main.storyboard in Resources */, ); diff --git a/Timer Demo/Timer Demo/ViewController.swift b/Timer Demo/Timer Demo/ViewController.swift index b1f4c19..2b52191 100644 --- a/Timer Demo/Timer Demo/ViewController.swift +++ b/Timer Demo/Timer Demo/ViewController.swift @@ -8,6 +8,7 @@ import UIKit import QuartzCore +import AVFoundation class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { @@ -18,11 +19,24 @@ class ViewController: UIViewController, UITableViewDataSource, UITableViewDelega var displayLink : CADisplayLink! var timers: [Timer] = []; let popcornTimer = Timer.init(startTime: 5.000) - let poopTimer = Timer.init(startTime: 45.000) + let poopTimer = Timer.init(startTime: 3.000) + + var audioPlayer = AVAudioPlayer() override func viewDidLoad() { super.viewDidLoad() + let alertSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("LoudAlarmClockBuzzer", ofType: "mp3")!) + + do { + try audioPlayer = AVAudioPlayer(contentsOfURL: alertSound) + } catch { + print("Error") + } + + audioPlayer.numberOfLoops = -1 + audioPlayer.prepareToPlay() + displayLink = CADisplayLink(target: self, selector: Selector("update")) displayLink.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes) @@ -47,6 +61,9 @@ class ViewController: UIViewController, UITableViewDataSource, UITableViewDelega if timer.isPaused == false{ updateTimer(timer) if (timer.remainingTime < 0.0){ + audioPlayer.play() + displayAlert() + timer.isPaused = true } } @@ -55,6 +72,18 @@ class ViewController: UIViewController, UITableViewDataSource, UITableViewDelega } } + func displayAlert(){ + let alertController = UIAlertController(title: "Time's up!", message: nil, preferredStyle: .Alert) + + let OKAction = UIAlertAction(title: "OK", style: .Default) { (action:UIAlertAction!) in + self.audioPlayer.stop() + } + + alertController.addAction(OKAction) + + self.presentViewController(alertController, animated: true, completion:nil) + } + func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { From ac05ad5a33f659696b7e6413f452bc857787ed48 Mon Sep 17 00:00:00 2001 From: Derek316x Date: Sat, 29 Aug 2015 11:48:28 -0400 Subject: [PATCH 38/79] stringFromTimeInterval --- Countdown/Countdown.xcodeproj/project.pbxproj | 506 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + Countdown/Countdown/AppDelegate.swift | 46 ++ .../AppIcon.appiconset/Contents.json | 68 +++ .../Base.lproj/LaunchScreen.storyboard | 49 ++ .../Countdown/Base.lproj/Main.storyboard | 25 + Countdown/Countdown/Info.plist | 47 ++ Countdown/Countdown/ViewController.swift | 25 + Countdown/CountdownTests/CountdownTests.swift | 35 ++ Countdown/CountdownTests/Info.plist | 24 + .../CountdownUITests/CountdownUITests.swift | 35 ++ Countdown/CountdownUITests/Info.plist | 24 + .../Timer Demo/CountdownViewController.swift | 35 ++ Timer Demo/Timer Demo/NSObjectExtension.swift | 13 + 14 files changed, 939 insertions(+) create mode 100644 Countdown/Countdown.xcodeproj/project.pbxproj create mode 100644 Countdown/Countdown.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Countdown/Countdown/AppDelegate.swift create mode 100644 Countdown/Countdown/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Countdown/Countdown/Base.lproj/LaunchScreen.storyboard create mode 100644 Countdown/Countdown/Base.lproj/Main.storyboard create mode 100644 Countdown/Countdown/Info.plist create mode 100644 Countdown/Countdown/ViewController.swift create mode 100644 Countdown/CountdownTests/CountdownTests.swift create mode 100644 Countdown/CountdownTests/Info.plist create mode 100644 Countdown/CountdownUITests/CountdownUITests.swift create mode 100644 Countdown/CountdownUITests/Info.plist create mode 100644 Timer Demo/Timer Demo/CountdownViewController.swift create mode 100644 Timer Demo/Timer Demo/NSObjectExtension.swift diff --git a/Countdown/Countdown.xcodeproj/project.pbxproj b/Countdown/Countdown.xcodeproj/project.pbxproj new file mode 100644 index 0000000..1886672 --- /dev/null +++ b/Countdown/Countdown.xcodeproj/project.pbxproj @@ -0,0 +1,506 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 69E810151B91F6B30061915A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69E810141B91F6B30061915A /* AppDelegate.swift */; }; + 69E810171B91F6B30061915A /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69E810161B91F6B30061915A /* ViewController.swift */; }; + 69E8101A1B91F6B30061915A /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 69E810181B91F6B30061915A /* Main.storyboard */; }; + 69E8101C1B91F6B30061915A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 69E8101B1B91F6B30061915A /* Assets.xcassets */; }; + 69E8101F1B91F6B30061915A /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 69E8101D1B91F6B30061915A /* LaunchScreen.storyboard */; }; + 69E8102A1B91F6B30061915A /* CountdownTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69E810291B91F6B30061915A /* CountdownTests.swift */; }; + 69E810351B91F6B30061915A /* CountdownUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69E810341B91F6B30061915A /* CountdownUITests.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 69E810261B91F6B30061915A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 69E810091B91F6B30061915A /* Project object */; + proxyType = 1; + remoteGlobalIDString = 69E810101B91F6B30061915A; + remoteInfo = Countdown; + }; + 69E810311B91F6B30061915A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 69E810091B91F6B30061915A /* Project object */; + proxyType = 1; + remoteGlobalIDString = 69E810101B91F6B30061915A; + remoteInfo = Countdown; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 69E810111B91F6B30061915A /* Countdown.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Countdown.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 69E810141B91F6B30061915A /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 69E810161B91F6B30061915A /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 69E810191B91F6B30061915A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 69E8101B1B91F6B30061915A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 69E8101E1B91F6B30061915A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 69E810201B91F6B30061915A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 69E810251B91F6B30061915A /* CountdownTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CountdownTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 69E810291B91F6B30061915A /* CountdownTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CountdownTests.swift; sourceTree = ""; }; + 69E8102B1B91F6B30061915A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 69E810301B91F6B30061915A /* CountdownUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CountdownUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 69E810341B91F6B30061915A /* CountdownUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CountdownUITests.swift; sourceTree = ""; }; + 69E810361B91F6B30061915A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 69E8100E1B91F6B30061915A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 69E810221B91F6B30061915A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 69E8102D1B91F6B30061915A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 69E810081B91F6B30061915A = { + isa = PBXGroup; + children = ( + 69E810131B91F6B30061915A /* Countdown */, + 69E810281B91F6B30061915A /* CountdownTests */, + 69E810331B91F6B30061915A /* CountdownUITests */, + 69E810121B91F6B30061915A /* Products */, + ); + sourceTree = ""; + }; + 69E810121B91F6B30061915A /* Products */ = { + isa = PBXGroup; + children = ( + 69E810111B91F6B30061915A /* Countdown.app */, + 69E810251B91F6B30061915A /* CountdownTests.xctest */, + 69E810301B91F6B30061915A /* CountdownUITests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 69E810131B91F6B30061915A /* Countdown */ = { + isa = PBXGroup; + children = ( + 69E810141B91F6B30061915A /* AppDelegate.swift */, + 69E810161B91F6B30061915A /* ViewController.swift */, + 69E810181B91F6B30061915A /* Main.storyboard */, + 69E8101B1B91F6B30061915A /* Assets.xcassets */, + 69E8101D1B91F6B30061915A /* LaunchScreen.storyboard */, + 69E810201B91F6B30061915A /* Info.plist */, + ); + path = Countdown; + sourceTree = ""; + }; + 69E810281B91F6B30061915A /* CountdownTests */ = { + isa = PBXGroup; + children = ( + 69E810291B91F6B30061915A /* CountdownTests.swift */, + 69E8102B1B91F6B30061915A /* Info.plist */, + ); + path = CountdownTests; + sourceTree = ""; + }; + 69E810331B91F6B30061915A /* CountdownUITests */ = { + isa = PBXGroup; + children = ( + 69E810341B91F6B30061915A /* CountdownUITests.swift */, + 69E810361B91F6B30061915A /* Info.plist */, + ); + path = CountdownUITests; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 69E810101B91F6B30061915A /* Countdown */ = { + isa = PBXNativeTarget; + buildConfigurationList = 69E810391B91F6B30061915A /* Build configuration list for PBXNativeTarget "Countdown" */; + buildPhases = ( + 69E8100D1B91F6B30061915A /* Sources */, + 69E8100E1B91F6B30061915A /* Frameworks */, + 69E8100F1B91F6B30061915A /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Countdown; + productName = Countdown; + productReference = 69E810111B91F6B30061915A /* Countdown.app */; + productType = "com.apple.product-type.application"; + }; + 69E810241B91F6B30061915A /* CountdownTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 69E8103C1B91F6B30061915A /* Build configuration list for PBXNativeTarget "CountdownTests" */; + buildPhases = ( + 69E810211B91F6B30061915A /* Sources */, + 69E810221B91F6B30061915A /* Frameworks */, + 69E810231B91F6B30061915A /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 69E810271B91F6B30061915A /* PBXTargetDependency */, + ); + name = CountdownTests; + productName = CountdownTests; + productReference = 69E810251B91F6B30061915A /* CountdownTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 69E8102F1B91F6B30061915A /* CountdownUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 69E8103F1B91F6B30061915A /* Build configuration list for PBXNativeTarget "CountdownUITests" */; + buildPhases = ( + 69E8102C1B91F6B30061915A /* Sources */, + 69E8102D1B91F6B30061915A /* Frameworks */, + 69E8102E1B91F6B30061915A /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 69E810321B91F6B30061915A /* PBXTargetDependency */, + ); + name = CountdownUITests; + productName = CountdownUITests; + productReference = 69E810301B91F6B30061915A /* CountdownUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 69E810091B91F6B30061915A /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0700; + ORGANIZATIONNAME = dereknetto; + TargetAttributes = { + 69E810101B91F6B30061915A = { + CreatedOnToolsVersion = 7.0; + }; + 69E810241B91F6B30061915A = { + CreatedOnToolsVersion = 7.0; + TestTargetID = 69E810101B91F6B30061915A; + }; + 69E8102F1B91F6B30061915A = { + CreatedOnToolsVersion = 7.0; + TestTargetID = 69E810101B91F6B30061915A; + }; + }; + }; + buildConfigurationList = 69E8100C1B91F6B30061915A /* Build configuration list for PBXProject "Countdown" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 69E810081B91F6B30061915A; + productRefGroup = 69E810121B91F6B30061915A /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 69E810101B91F6B30061915A /* Countdown */, + 69E810241B91F6B30061915A /* CountdownTests */, + 69E8102F1B91F6B30061915A /* CountdownUITests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 69E8100F1B91F6B30061915A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 69E8101F1B91F6B30061915A /* LaunchScreen.storyboard in Resources */, + 69E8101C1B91F6B30061915A /* Assets.xcassets in Resources */, + 69E8101A1B91F6B30061915A /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 69E810231B91F6B30061915A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 69E8102E1B91F6B30061915A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 69E8100D1B91F6B30061915A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 69E810171B91F6B30061915A /* ViewController.swift in Sources */, + 69E810151B91F6B30061915A /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 69E810211B91F6B30061915A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 69E8102A1B91F6B30061915A /* CountdownTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 69E8102C1B91F6B30061915A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 69E810351B91F6B30061915A /* CountdownUITests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 69E810271B91F6B30061915A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 69E810101B91F6B30061915A /* Countdown */; + targetProxy = 69E810261B91F6B30061915A /* PBXContainerItemProxy */; + }; + 69E810321B91F6B30061915A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 69E810101B91F6B30061915A /* Countdown */; + targetProxy = 69E810311B91F6B30061915A /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 69E810181B91F6B30061915A /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 69E810191B91F6B30061915A /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 69E8101D1B91F6B30061915A /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 69E8101E1B91F6B30061915A /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 69E810371B91F6B30061915A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + 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 = 9.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 69E810381B91F6B30061915A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "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 = gnu99; + 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 = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 69E8103A1B91F6B30061915A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = Countdown/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = nyc.c4q.Derek316x.Countdown; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 69E8103B1B91F6B30061915A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = Countdown/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = nyc.c4q.Derek316x.Countdown; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 69E8103D1B91F6B30061915A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + INFOPLIST_FILE = CountdownTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = nyc.c4q.Derek316x.CountdownTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Countdown.app/Countdown"; + }; + name = Debug; + }; + 69E8103E1B91F6B30061915A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + INFOPLIST_FILE = CountdownTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = nyc.c4q.Derek316x.CountdownTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Countdown.app/Countdown"; + }; + name = Release; + }; + 69E810401B91F6B30061915A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = CountdownUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = nyc.c4q.Derek316x.CountdownUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_TARGET_NAME = Countdown; + USES_XCTRUNNER = YES; + }; + name = Debug; + }; + 69E810411B91F6B30061915A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = CountdownUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = nyc.c4q.Derek316x.CountdownUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_TARGET_NAME = Countdown; + USES_XCTRUNNER = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 69E8100C1B91F6B30061915A /* Build configuration list for PBXProject "Countdown" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 69E810371B91F6B30061915A /* Debug */, + 69E810381B91F6B30061915A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 69E810391B91F6B30061915A /* Build configuration list for PBXNativeTarget "Countdown" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 69E8103A1B91F6B30061915A /* Debug */, + 69E8103B1B91F6B30061915A /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; + 69E8103C1B91F6B30061915A /* Build configuration list for PBXNativeTarget "CountdownTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 69E8103D1B91F6B30061915A /* Debug */, + 69E8103E1B91F6B30061915A /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; + 69E8103F1B91F6B30061915A /* Build configuration list for PBXNativeTarget "CountdownUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 69E810401B91F6B30061915A /* Debug */, + 69E810411B91F6B30061915A /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; +/* End XCConfigurationList section */ + }; + rootObject = 69E810091B91F6B30061915A /* Project object */; +} diff --git a/Countdown/Countdown.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Countdown/Countdown.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..aa17812 --- /dev/null +++ b/Countdown/Countdown.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Countdown/Countdown/AppDelegate.swift b/Countdown/Countdown/AppDelegate.swift new file mode 100644 index 0000000..5244ad9 --- /dev/null +++ b/Countdown/Countdown/AppDelegate.swift @@ -0,0 +1,46 @@ +// +// AppDelegate.swift +// Countdown +// +// Created by Z on 8/29/15. +// Copyright © 2015 dereknetto. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + + func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { + // Override point for customization after application launch. + return true + } + + func applicationWillResignActive(application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(application: UIApplication) { + // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + +} + diff --git a/Countdown/Countdown/Assets.xcassets/AppIcon.appiconset/Contents.json b/Countdown/Countdown/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..36d2c80 --- /dev/null +++ b/Countdown/Countdown/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "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" : "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" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Countdown/Countdown/Base.lproj/LaunchScreen.storyboard b/Countdown/Countdown/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..25e33fa --- /dev/null +++ b/Countdown/Countdown/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Countdown/Countdown/Base.lproj/Main.storyboard b/Countdown/Countdown/Base.lproj/Main.storyboard new file mode 100644 index 0000000..3a2a49b --- /dev/null +++ b/Countdown/Countdown/Base.lproj/Main.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Countdown/Countdown/Info.plist b/Countdown/Countdown/Info.plist new file mode 100644 index 0000000..40c6215 --- /dev/null +++ b/Countdown/Countdown/Info.plist @@ -0,0 +1,47 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Countdown/Countdown/ViewController.swift b/Countdown/Countdown/ViewController.swift new file mode 100644 index 0000000..0e7332c --- /dev/null +++ b/Countdown/Countdown/ViewController.swift @@ -0,0 +1,25 @@ +// +// ViewController.swift +// Countdown +// +// Created by Z on 8/29/15. +// Copyright © 2015 dereknetto. 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. + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + +} + diff --git a/Countdown/CountdownTests/CountdownTests.swift b/Countdown/CountdownTests/CountdownTests.swift new file mode 100644 index 0000000..83db825 --- /dev/null +++ b/Countdown/CountdownTests/CountdownTests.swift @@ -0,0 +1,35 @@ +// +// CountdownTests.swift +// CountdownTests +// +// Created by Z on 8/29/15. +// Copyright © 2015 dereknetto. All rights reserved. +// + +import XCTest + +class CountdownTests: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testPerformanceExample() { + // This is an example of a performance test case. + self.measureBlock() { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/Countdown/CountdownTests/Info.plist b/Countdown/CountdownTests/Info.plist new file mode 100644 index 0000000..ba72822 --- /dev/null +++ b/Countdown/CountdownTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/Countdown/CountdownUITests/CountdownUITests.swift b/Countdown/CountdownUITests/CountdownUITests.swift new file mode 100644 index 0000000..b2d7725 --- /dev/null +++ b/Countdown/CountdownUITests/CountdownUITests.swift @@ -0,0 +1,35 @@ +// +// CountdownUITests.swift +// CountdownUITests +// +// Created by Z on 8/29/15. +// Copyright © 2015 dereknetto. All rights reserved. +// + +import Foundation +import XCTest + +class CountdownUITests: XCTestCase { + + override func setUp() { + super.setUp() + + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. + XCUIApplication().launch() + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // Use recording to get started writing UI tests. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + +} diff --git a/Countdown/CountdownUITests/Info.plist b/Countdown/CountdownUITests/Info.plist new file mode 100644 index 0000000..ba72822 --- /dev/null +++ b/Countdown/CountdownUITests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/Timer Demo/Timer Demo/CountdownViewController.swift b/Timer Demo/Timer Demo/CountdownViewController.swift new file mode 100644 index 0000000..ee16203 --- /dev/null +++ b/Timer Demo/Timer Demo/CountdownViewController.swift @@ -0,0 +1,35 @@ +// +// CountdownViewController.swift +// Timer Demo +// +// Created by Z on 8/29/15. +// Copyright © 2015 dereknetto. All rights reserved. +// + +import UIKit + +class CountdownViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/Timer Demo/Timer Demo/NSObjectExtension.swift b/Timer Demo/Timer Demo/NSObjectExtension.swift new file mode 100644 index 0000000..ff54c99 --- /dev/null +++ b/Timer Demo/Timer Demo/NSObjectExtension.swift @@ -0,0 +1,13 @@ +// +// NSObjectExtension.swift +// Timer Demo +// +// Created by Z on 8/29/15. +// Copyright © 2015 dereknetto. All rights reserved. +// + +import UIKit + +class NSObjectExtension: NSObject { + +} From f1b7c03aa428000611476ab82b746bfb394b11f7 Mon Sep 17 00:00:00 2001 From: Derek316x Date: Sat, 29 Aug 2015 11:48:57 -0400 Subject: [PATCH 39/79] v --- Countdown/Countdown/ViewController.swift | 7 --- .../Timer Demo.xcodeproj/project.pbxproj | 8 ++++ .../Timer Demo/Base.lproj/Main.storyboard | 36 ++++++++++---- .../Timer Demo/CountdownViewController.swift | 9 +--- Timer Demo/Timer Demo/NSObjectExtension.swift | 47 ++++++++++++++----- Timer Demo/Timer Demo/TableViewCell.swift | 4 -- Timer Demo/Timer Demo/Timer.swift | 34 +++++++++++--- Timer Demo/Timer Demo/ViewController.swift | 2 - 8 files changed, 100 insertions(+), 47 deletions(-) diff --git a/Countdown/Countdown/ViewController.swift b/Countdown/Countdown/ViewController.swift index 0e7332c..ecbb46d 100644 --- a/Countdown/Countdown/ViewController.swift +++ b/Countdown/Countdown/ViewController.swift @@ -12,14 +12,7 @@ class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - // Do any additional setup after loading the view, typically from a nib. } - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. - } - - } diff --git a/Timer Demo/Timer Demo.xcodeproj/project.pbxproj b/Timer Demo/Timer Demo.xcodeproj/project.pbxproj index f3e8aaf..7d7452a 100644 --- a/Timer Demo/Timer Demo.xcodeproj/project.pbxproj +++ b/Timer Demo/Timer Demo.xcodeproj/project.pbxproj @@ -17,6 +17,8 @@ 698173911B88EFF0000D38F2 /* Timer_DemoTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 698173901B88EFF0000D38F2 /* Timer_DemoTests.swift */; }; 6981739C1B88EFF0000D38F2 /* Timer_DemoUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6981739B1B88EFF0000D38F2 /* Timer_DemoUITests.swift */; }; 698173AA1B88F28C000D38F2 /* Timer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 698173A91B88F28C000D38F2 /* Timer.swift */; }; + 69E810431B91FD170061915A /* CountdownViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69E810421B91FD170061915A /* CountdownViewController.swift */; }; + 69E810471B9209790061915A /* NSObjectExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69E810461B9209790061915A /* NSObjectExtension.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -53,6 +55,8 @@ 6981739B1B88EFF0000D38F2 /* Timer_DemoUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Timer_DemoUITests.swift; sourceTree = ""; }; 6981739D1B88EFF0000D38F2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 698173A91B88F28C000D38F2 /* Timer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Timer.swift; sourceTree = ""; }; + 69E810421B91FD170061915A /* CountdownViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CountdownViewController.swift; sourceTree = ""; }; + 69E810461B9209790061915A /* NSObjectExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSObjectExtension.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -108,6 +112,8 @@ 5016E10B1B89209300C5EFFD /* TableViewCell.swift */, 6981737D1B88EFF0000D38F2 /* ViewController.swift */, 504DC2281B8FE3E30071A35E /* StopwatchViewController.swift */, + 69E810421B91FD170061915A /* CountdownViewController.swift */, + 69E810461B9209790061915A /* NSObjectExtension.swift */, 6981737F1B88EFF0000D38F2 /* Main.storyboard */, 698173821B88EFF0000D38F2 /* Assets.xcassets */, 698173841B88EFF0000D38F2 /* LaunchScreen.storyboard */, @@ -264,6 +270,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 69E810471B9209790061915A /* NSObjectExtension.swift in Sources */, + 69E810431B91FD170061915A /* CountdownViewController.swift in Sources */, 698173AA1B88F28C000D38F2 /* Timer.swift in Sources */, 5016E10C1B89209300C5EFFD /* TableViewCell.swift in Sources */, 504DC2291B8FE3E30071A35E /* StopwatchViewController.swift in Sources */, diff --git a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard index 0ba4bef..36e07eb 100644 --- a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard +++ b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard @@ -1,7 +1,7 @@ - + - + @@ -17,18 +17,37 @@ - - + + + - + + + + + + + + + + + + + + + + + + + + - @@ -39,6 +58,7 @@ + @@ -61,13 +81,13 @@ - + - + diff --git a/Timer Demo/Timer Demo/CountdownViewController.swift b/Timer Demo/Timer Demo/CountdownViewController.swift index ee16203..4373046 100644 --- a/Timer Demo/Timer Demo/CountdownViewController.swift +++ b/Timer Demo/Timer Demo/CountdownViewController.swift @@ -12,15 +12,8 @@ class CountdownViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - - // Do any additional setup after loading the view. - } - - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. + } - /* // MARK: - Navigation diff --git a/Timer Demo/Timer Demo/NSObjectExtension.swift b/Timer Demo/Timer Demo/NSObjectExtension.swift index ff54c99..f990c1c 100644 --- a/Timer Demo/Timer Demo/NSObjectExtension.swift +++ b/Timer Demo/Timer Demo/NSObjectExtension.swift @@ -1,13 +1,36 @@ -// -// NSObjectExtension.swift -// Timer Demo -// -// Created by Z on 8/29/15. -// Copyright © 2015 dereknetto. All rights reserved. -// +import Foundation -import UIKit - -class NSObjectExtension: NSObject { - -} +extension NSObject { + + // + // Retrieves an array of property names found on the current object + // using Objective-C runtime functions for introspection: + // https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtPropertyIntrospection.html + // + func propertyNames() -> Array { + var results: Array = []; + + // retrieve the properties via the class_copyPropertyList function + var count: UInt32 = 0; + let myClass: AnyClass = self.classForCoder; + var properties = class_copyPropertyList(myClass, &count); + + // iterate each objc_property_t struct + for var i: UInt32 = 0; i < count; i++ { + let property = properties[Int(i)]; + + // retrieve the property name by calling property_getName function + let cname = property_getName(property); + + // covert the c string into a Swift string + let name = String.fromCString(cname); + results.append(name!); + } + + // release objc_property_t structs + free(properties); + + return results; + } + +} \ No newline at end of file diff --git a/Timer Demo/Timer Demo/TableViewCell.swift b/Timer Demo/Timer Demo/TableViewCell.swift index c7e2358..077c335 100644 --- a/Timer Demo/Timer Demo/TableViewCell.swift +++ b/Timer Demo/Timer Demo/TableViewCell.swift @@ -20,10 +20,6 @@ class TableViewCell: UITableViewCell { override func awakeFromNib() { super.awakeFromNib() - - - - } override func setSelected(selected: Bool, animated: Bool) { diff --git a/Timer Demo/Timer Demo/Timer.swift b/Timer Demo/Timer Demo/Timer.swift index 4c34baf..23062fb 100644 --- a/Timer Demo/Timer Demo/Timer.swift +++ b/Timer Demo/Timer Demo/Timer.swift @@ -13,25 +13,47 @@ class Timer: NSObject { var startTime: CFTimeInterval! var remainingTime: CFTimeInterval! var isPaused = true - + init(startTime:CFTimeInterval){ self.startTime = startTime self.remainingTime = startTime } +// func stringFromTimeInterval(interval: CFTimeInterval) -> String{ +// let intInterval = Int(interval) +// let minutes = (intInterval / 60) % 60 +// let seconds = intInterval % 60 +// let milliseconds = Int(floor(((interval - floor(interval)) * 100))) +// +// let minutesString = minutes > 9 ? "\(minutes)" : "0\(minutes)" +// let secondsString = seconds > 9 ? "\(seconds)" : "0\(seconds)" +// let millisecondsString = milliseconds > 9 ? "\(milliseconds)" : "0\(milliseconds)" +// +// let timeString = minutesString + ":" + secondsString + "." + millisecondsString +// +// return timeString +// } + func stringFromTimeInterval(interval: CFTimeInterval) -> String{ let intInterval = Int(interval) + + let years = (intInterval / 31556900) + let months = (intInterval / 2629740) % 12 + let days = (intInterval / (3600 * 24)) % 365 + let hours = (intInterval / 3600) % 24 let minutes = (intInterval / 60) % 60 let seconds = intInterval % 60 let milliseconds = Int(floor(((interval - floor(interval)) * 100))) - let minutesString = minutes > 9 ? "\(minutes)" : "0\(minutes)" - let secondsString = seconds > 9 ? "\(seconds)" : "0\(seconds)" - let millisecondsString = milliseconds > 9 ? "\(milliseconds)" : "0\(milliseconds)" + let timeUnits = [years, months, days, hours, minutes, seconds, milliseconds] - let timeString = minutesString + ":" + secondsString + "." + millisecondsString + var timeString = "" + for unit in timeUnits{ + let unitString = unit > 9 ? "\(unit)" : "0\(unit)" + timeString = timeString + unitString + ":" + } - return timeString + return timeString } } diff --git a/Timer Demo/Timer Demo/ViewController.swift b/Timer Demo/Timer Demo/ViewController.swift index b1f4c19..04e01eb 100644 --- a/Timer Demo/Timer Demo/ViewController.swift +++ b/Timer Demo/Timer Demo/ViewController.swift @@ -50,12 +50,10 @@ class ViewController: UIViewController, UITableViewDataSource, UITableViewDelega timer.isPaused = true } } - tableView.reloadData() } } - func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! TableViewCell From bca8192be3c7dd10ecfa16c74dcae720746f49dd Mon Sep 17 00:00:00 2001 From: JovannyEspinal Date: Sat, 29 Aug 2015 12:02:02 -0400 Subject: [PATCH 40/79] Added Timer Name's to Table View Cells --- .../Timer Demo.xcodeproj/project.pbxproj | 12 ++-- .../Timer Demo/Base.lproj/Main.storyboard | 5 +- .../Timer Demo/LoudAlarmClockBuzzer.mp3 | Bin 0 -> 271444 bytes Timer Demo/Timer Demo/NSObjectExtension.swift | 36 ----------- Timer Demo/Timer Demo/TableViewCell.swift | 1 + Timer Demo/Timer Demo/Timer.swift | 58 +++++++++--------- Timer Demo/Timer Demo/ViewController.swift | 6 +- 7 files changed, 42 insertions(+), 76 deletions(-) create mode 100644 Timer Demo/Timer Demo/LoudAlarmClockBuzzer.mp3 delete mode 100644 Timer Demo/Timer Demo/NSObjectExtension.swift diff --git a/Timer Demo/Timer Demo.xcodeproj/project.pbxproj b/Timer Demo/Timer Demo.xcodeproj/project.pbxproj index d197a8d..57d5cec 100644 --- a/Timer Demo/Timer Demo.xcodeproj/project.pbxproj +++ b/Timer Demo/Timer Demo.xcodeproj/project.pbxproj @@ -10,7 +10,7 @@ 5016E10C1B89209300C5EFFD /* TableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5016E10B1B89209300C5EFFD /* TableViewCell.swift */; }; 504DC2291B8FE3E30071A35E /* StopwatchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504DC2281B8FE3E30071A35E /* StopwatchViewController.swift */; }; 504DC22B1B91FD8A0071A35E /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 504DC22A1B91FD8A0071A35E /* AVFoundation.framework */; }; - 504DC22D1B91FE9F0071A35E /* LoudAlarmClockBuzzer.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = 504DC22C1B91FE9F0071A35E /* LoudAlarmClockBuzzer.mp3 */; }; + 504DC22F1B920D210071A35E /* LoudAlarmClockBuzzer.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = 504DC22E1B920D210071A35E /* LoudAlarmClockBuzzer.mp3 */; }; 6981737C1B88EFF0000D38F2 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6981737B1B88EFF0000D38F2 /* AppDelegate.swift */; }; 6981737E1B88EFF0000D38F2 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6981737D1B88EFF0000D38F2 /* ViewController.swift */; }; 698173811B88EFF0000D38F2 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6981737F1B88EFF0000D38F2 /* Main.storyboard */; }; @@ -20,7 +20,6 @@ 6981739C1B88EFF0000D38F2 /* Timer_DemoUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6981739B1B88EFF0000D38F2 /* Timer_DemoUITests.swift */; }; 698173AA1B88F28C000D38F2 /* Timer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 698173A91B88F28C000D38F2 /* Timer.swift */; }; 69E810431B91FD170061915A /* CountdownViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69E810421B91FD170061915A /* CountdownViewController.swift */; }; - 69E810471B9209790061915A /* NSObjectExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69E810461B9209790061915A /* NSObjectExtension.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -44,7 +43,7 @@ 5016E10B1B89209300C5EFFD /* TableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableViewCell.swift; sourceTree = ""; }; 504DC2281B8FE3E30071A35E /* StopwatchViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StopwatchViewController.swift; sourceTree = ""; }; 504DC22A1B91FD8A0071A35E /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; - 504DC22C1B91FE9F0071A35E /* LoudAlarmClockBuzzer.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; name = LoudAlarmClockBuzzer.mp3; path = ../../../../../../../../Downloads/LoudAlarmClockBuzzer.mp3; sourceTree = ""; }; + 504DC22E1B920D210071A35E /* LoudAlarmClockBuzzer.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = LoudAlarmClockBuzzer.mp3; sourceTree = ""; }; 698173781B88EFF0000D38F2 /* Timer Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Timer Demo.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 6981737B1B88EFF0000D38F2 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 6981737D1B88EFF0000D38F2 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; @@ -60,7 +59,6 @@ 6981739D1B88EFF0000D38F2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 698173A91B88F28C000D38F2 /* Timer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Timer.swift; sourceTree = ""; }; 69E810421B91FD170061915A /* CountdownViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CountdownViewController.swift; sourceTree = ""; }; - 69E810461B9209790061915A /* NSObjectExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSObjectExtension.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -113,14 +111,13 @@ 6981737A1B88EFF0000D38F2 /* Timer Demo */ = { isa = PBXGroup; children = ( - 504DC22C1B91FE9F0071A35E /* LoudAlarmClockBuzzer.mp3 */, 6981737B1B88EFF0000D38F2 /* AppDelegate.swift */, 698173A91B88F28C000D38F2 /* Timer.swift */, + 504DC22E1B920D210071A35E /* LoudAlarmClockBuzzer.mp3 */, 5016E10B1B89209300C5EFFD /* TableViewCell.swift */, 6981737D1B88EFF0000D38F2 /* ViewController.swift */, 504DC2281B8FE3E30071A35E /* StopwatchViewController.swift */, 69E810421B91FD170061915A /* CountdownViewController.swift */, - 69E810461B9209790061915A /* NSObjectExtension.swift */, 6981737F1B88EFF0000D38F2 /* Main.storyboard */, 698173821B88EFF0000D38F2 /* Assets.xcassets */, 698173841B88EFF0000D38F2 /* LaunchScreen.storyboard */, @@ -251,7 +248,7 @@ buildActionMask = 2147483647; files = ( 698173861B88EFF0000D38F2 /* LaunchScreen.storyboard in Resources */, - 504DC22D1B91FE9F0071A35E /* LoudAlarmClockBuzzer.mp3 in Resources */, + 504DC22F1B920D210071A35E /* LoudAlarmClockBuzzer.mp3 in Resources */, 698173831B88EFF0000D38F2 /* Assets.xcassets in Resources */, 698173811B88EFF0000D38F2 /* Main.storyboard in Resources */, ); @@ -278,7 +275,6 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 69E810471B9209790061915A /* NSObjectExtension.swift in Sources */, 69E810431B91FD170061915A /* CountdownViewController.swift in Sources */, 698173AA1B88F28C000D38F2 /* Timer.swift in Sources */, 5016E10C1B89209300C5EFFD /* TableViewCell.swift in Sources */, diff --git a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard index 36e07eb..524b3ed 100644 --- a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard +++ b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard @@ -1,7 +1,7 @@ - + - + @@ -155,6 +155,7 @@ + diff --git a/Timer Demo/Timer Demo/LoudAlarmClockBuzzer.mp3 b/Timer Demo/Timer Demo/LoudAlarmClockBuzzer.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..6dc951439769c2e1efb0535b93af6276440fbf02 GIT binary patch literal 271444 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�%Q=-6YL@V?aO+0FH!V$!{OGPTIv9h5=1 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 Array { - var results: Array = []; - - // retrieve the properties via the class_copyPropertyList function - var count: UInt32 = 0; - let myClass: AnyClass = self.classForCoder; - var properties = class_copyPropertyList(myClass, &count); - - // iterate each objc_property_t struct - for var i: UInt32 = 0; i < count; i++ { - let property = properties[Int(i)]; - - // retrieve the property name by calling property_getName function - let cname = property_getName(property); - - // covert the c string into a Swift string - let name = String.fromCString(cname); - results.append(name!); - } - - // release objc_property_t structs - free(properties); - - return results; - } - -} \ No newline at end of file diff --git a/Timer Demo/Timer Demo/TableViewCell.swift b/Timer Demo/Timer Demo/TableViewCell.swift index 077c335..7dd07bc 100644 --- a/Timer Demo/Timer Demo/TableViewCell.swift +++ b/Timer Demo/Timer Demo/TableViewCell.swift @@ -10,6 +10,7 @@ import UIKit class TableViewCell: UITableViewCell { + @IBOutlet weak var timerName: UILabel! @IBOutlet weak var timerLabel: UILabel! @IBOutlet weak var startPauseButton: UIButton! @IBOutlet weak var progressBar: UIProgressView! diff --git a/Timer Demo/Timer Demo/Timer.swift b/Timer Demo/Timer Demo/Timer.swift index 23062fb..e41ccc9 100644 --- a/Timer Demo/Timer Demo/Timer.swift +++ b/Timer Demo/Timer Demo/Timer.swift @@ -10,50 +10,52 @@ import UIKit class Timer: NSObject { + var timerName : String var startTime: CFTimeInterval! var remainingTime: CFTimeInterval! var isPaused = true - init(startTime:CFTimeInterval){ + init(timerLabel: String, startTime:CFTimeInterval){ self.startTime = startTime self.remainingTime = startTime + self.timerName = timerLabel } -// func stringFromTimeInterval(interval: CFTimeInterval) -> String{ -// let intInterval = Int(interval) -// let minutes = (intInterval / 60) % 60 -// let seconds = intInterval % 60 -// let milliseconds = Int(floor(((interval - floor(interval)) * 100))) -// -// let minutesString = minutes > 9 ? "\(minutes)" : "0\(minutes)" -// let secondsString = seconds > 9 ? "\(seconds)" : "0\(seconds)" -// let millisecondsString = milliseconds > 9 ? "\(milliseconds)" : "0\(milliseconds)" -// -// let timeString = minutesString + ":" + secondsString + "." + millisecondsString -// -// return timeString -// } - func stringFromTimeInterval(interval: CFTimeInterval) -> String{ let intInterval = Int(interval) - - let years = (intInterval / 31556900) - let months = (intInterval / 2629740) % 12 - let days = (intInterval / (3600 * 24)) % 365 - let hours = (intInterval / 3600) % 24 let minutes = (intInterval / 60) % 60 let seconds = intInterval % 60 let milliseconds = Int(floor(((interval - floor(interval)) * 100))) - let timeUnits = [years, months, days, hours, minutes, seconds, milliseconds] + let minutesString = minutes > 9 ? "\(minutes)" : "0\(minutes)" + let secondsString = seconds > 9 ? "\(seconds)" : "0\(seconds)" + let millisecondsString = milliseconds > 9 ? "\(milliseconds)" : "0\(milliseconds)" - var timeString = "" - for unit in timeUnits{ - let unitString = unit > 9 ? "\(unit)" : "0\(unit)" - timeString = timeString + unitString + ":" - } + let timeString = minutesString + ":" + secondsString + "." + millisecondsString - return timeString + return timeString } + +// func stringFromTimeInterval(interval: CFTimeInterval) -> String{ +// let intInterval = Int(interval) +// +// let years = (intInterval / 31556900) +// let months = (intInterval / 2629740) % 12 +// let days = (intInterval / (3600 * 24)) % 365 +// let hours = (intInterval / 3600) % 24 +// let minutes = (intInterval / 60) % 60 +// let seconds = intInterval % 60 +// let milliseconds = Int(floor(((interval - floor(interval)) * 100))) +// +// let timeUnits = [years, months, days, hours, minutes, seconds, milliseconds] +// +// var timeString = "" +// for unit in timeUnits{ +// let unitString = unit > 9 ? "\(unit)" : "0\(unit)" +// timeString = timeString + unitString + ":" +// } +// +// return timeString +// } } diff --git a/Timer Demo/Timer Demo/ViewController.swift b/Timer Demo/Timer Demo/ViewController.swift index be358ae..0194a27 100644 --- a/Timer Demo/Timer Demo/ViewController.swift +++ b/Timer Demo/Timer Demo/ViewController.swift @@ -18,8 +18,8 @@ class ViewController: UIViewController, UITableViewDataSource, UITableViewDelega var displayLink : CADisplayLink! var timers: [Timer] = []; - let popcornTimer = Timer.init(startTime: 5.000) - let poopTimer = Timer.init(startTime: 3.000) + let popcornTimer = Timer.init(timerLabel: "Popcorn", startTime: 4.000) + let poopTimer = Timer.init(timerLabel: "Poop", startTime: 3.000) var audioPlayer = AVAudioPlayer() @@ -91,8 +91,10 @@ class ViewController: UIViewController, UITableViewDataSource, UITableViewDelega cell.timer = timer + cell.timerName.text = cell.timer.timerName cell.timerLabel.text = String(cell.timer.stringFromTimeInterval(cell.timer.remainingTime)) + if timer.isPaused { cell.startPauseButton.setImage(UIImage(named: "Start-50.png"), forState: .Normal) cell.timer.remainingTime = cell.timer.startTime From 05f72e9f13df4ecd7bb0f1a424b466e36daf5cb1 Mon Sep 17 00:00:00 2001 From: Derek316x Date: Sat, 29 Aug 2015 12:34:27 -0400 Subject: [PATCH 41/79] stringfromtimeinterval fixed --- MyPlayground.playground/Contents.swift | 12 + MyPlayground.playground/contents.xcplayground | 4 + .../contents.xcworkspacedata | 7 + MyPlayground.playground/timeline.xctimeline | 6 + .../project.pbxproj | 506 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../AppDelegate.swift | 46 ++ .../AppIcon.appiconset/Contents.json | 68 +++ .../Base.lproj/LaunchScreen.storyboard | 49 ++ .../Base.lproj/Main.storyboard | 61 +++ .../StringFromTimeIntervalDemo/Info.plist | 47 ++ .../ViewController.swift | 64 +++ .../Info.plist | 24 + .../StringFromTimeIntervalDemoTests.swift | 35 ++ .../Info.plist | 24 + .../StringFromTimeIntervalDemoUITests.swift | 35 ++ .../Timer Demo.xcodeproj/project.pbxproj | 4 - Timer Demo/Timer Demo/Timer.swift | 2 + Timer Demo/Timer Demo/ViewController.swift | 14 +- 19 files changed, 1004 insertions(+), 11 deletions(-) create mode 100644 MyPlayground.playground/Contents.swift create mode 100644 MyPlayground.playground/contents.xcplayground create mode 100644 MyPlayground.playground/playground.xcworkspace/contents.xcworkspacedata create mode 100644 MyPlayground.playground/timeline.xctimeline create mode 100644 StringFromTimeIntervalDemo/StringFromTimeIntervalDemo.xcodeproj/project.pbxproj create mode 100644 StringFromTimeIntervalDemo/StringFromTimeIntervalDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/AppDelegate.swift create mode 100644 StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/Base.lproj/LaunchScreen.storyboard create mode 100644 StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/Base.lproj/Main.storyboard create mode 100644 StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/Info.plist create mode 100644 StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/ViewController.swift create mode 100644 StringFromTimeIntervalDemo/StringFromTimeIntervalDemoTests/Info.plist create mode 100644 StringFromTimeIntervalDemo/StringFromTimeIntervalDemoTests/StringFromTimeIntervalDemoTests.swift create mode 100644 StringFromTimeIntervalDemo/StringFromTimeIntervalDemoUITests/Info.plist create mode 100644 StringFromTimeIntervalDemo/StringFromTimeIntervalDemoUITests/StringFromTimeIntervalDemoUITests.swift diff --git a/MyPlayground.playground/Contents.swift b/MyPlayground.playground/Contents.swift new file mode 100644 index 0000000..2c24b6c --- /dev/null +++ b/MyPlayground.playground/Contents.swift @@ -0,0 +1,12 @@ +//: Playground - noun: a place where people can play + +import UIKit + +var str = "Hello, playground" + + +var a:Int = 365 +var b:Int = 365 + +let q = b/a + diff --git a/MyPlayground.playground/contents.xcplayground b/MyPlayground.playground/contents.xcplayground new file mode 100644 index 0000000..ee7c14f --- /dev/null +++ b/MyPlayground.playground/contents.xcplayground @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/MyPlayground.playground/playground.xcworkspace/contents.xcworkspacedata b/MyPlayground.playground/playground.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/MyPlayground.playground/playground.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/MyPlayground.playground/timeline.xctimeline b/MyPlayground.playground/timeline.xctimeline new file mode 100644 index 0000000..bf468af --- /dev/null +++ b/MyPlayground.playground/timeline.xctimeline @@ -0,0 +1,6 @@ + + + + + diff --git a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo.xcodeproj/project.pbxproj b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo.xcodeproj/project.pbxproj new file mode 100644 index 0000000..49bf441 --- /dev/null +++ b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo.xcodeproj/project.pbxproj @@ -0,0 +1,506 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 69E810551B920D7E0061915A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69E810541B920D7E0061915A /* AppDelegate.swift */; }; + 69E810571B920D7E0061915A /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69E810561B920D7E0061915A /* ViewController.swift */; }; + 69E8105A1B920D7E0061915A /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 69E810581B920D7E0061915A /* Main.storyboard */; }; + 69E8105C1B920D7E0061915A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 69E8105B1B920D7E0061915A /* Assets.xcassets */; }; + 69E8105F1B920D7E0061915A /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 69E8105D1B920D7E0061915A /* LaunchScreen.storyboard */; }; + 69E8106A1B920D7E0061915A /* StringFromTimeIntervalDemoTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69E810691B920D7E0061915A /* StringFromTimeIntervalDemoTests.swift */; }; + 69E810751B920D7E0061915A /* StringFromTimeIntervalDemoUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69E810741B920D7E0061915A /* StringFromTimeIntervalDemoUITests.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 69E810661B920D7E0061915A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 69E810491B920D7E0061915A /* Project object */; + proxyType = 1; + remoteGlobalIDString = 69E810501B920D7E0061915A; + remoteInfo = StringFromTimeIntervalDemo; + }; + 69E810711B920D7E0061915A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 69E810491B920D7E0061915A /* Project object */; + proxyType = 1; + remoteGlobalIDString = 69E810501B920D7E0061915A; + remoteInfo = StringFromTimeIntervalDemo; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 69E810511B920D7E0061915A /* StringFromTimeIntervalDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = StringFromTimeIntervalDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 69E810541B920D7E0061915A /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 69E810561B920D7E0061915A /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 69E810591B920D7E0061915A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 69E8105B1B920D7E0061915A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 69E8105E1B920D7E0061915A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 69E810601B920D7E0061915A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 69E810651B920D7E0061915A /* StringFromTimeIntervalDemoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = StringFromTimeIntervalDemoTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 69E810691B920D7E0061915A /* StringFromTimeIntervalDemoTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringFromTimeIntervalDemoTests.swift; sourceTree = ""; }; + 69E8106B1B920D7E0061915A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 69E810701B920D7E0061915A /* StringFromTimeIntervalDemoUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = StringFromTimeIntervalDemoUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 69E810741B920D7E0061915A /* StringFromTimeIntervalDemoUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringFromTimeIntervalDemoUITests.swift; sourceTree = ""; }; + 69E810761B920D7E0061915A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 69E8104E1B920D7E0061915A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 69E810621B920D7E0061915A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 69E8106D1B920D7E0061915A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 69E810481B920D7E0061915A = { + isa = PBXGroup; + children = ( + 69E810531B920D7E0061915A /* StringFromTimeIntervalDemo */, + 69E810681B920D7E0061915A /* StringFromTimeIntervalDemoTests */, + 69E810731B920D7E0061915A /* StringFromTimeIntervalDemoUITests */, + 69E810521B920D7E0061915A /* Products */, + ); + sourceTree = ""; + }; + 69E810521B920D7E0061915A /* Products */ = { + isa = PBXGroup; + children = ( + 69E810511B920D7E0061915A /* StringFromTimeIntervalDemo.app */, + 69E810651B920D7E0061915A /* StringFromTimeIntervalDemoTests.xctest */, + 69E810701B920D7E0061915A /* StringFromTimeIntervalDemoUITests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 69E810531B920D7E0061915A /* StringFromTimeIntervalDemo */ = { + isa = PBXGroup; + children = ( + 69E810541B920D7E0061915A /* AppDelegate.swift */, + 69E810561B920D7E0061915A /* ViewController.swift */, + 69E810581B920D7E0061915A /* Main.storyboard */, + 69E8105B1B920D7E0061915A /* Assets.xcassets */, + 69E8105D1B920D7E0061915A /* LaunchScreen.storyboard */, + 69E810601B920D7E0061915A /* Info.plist */, + ); + path = StringFromTimeIntervalDemo; + sourceTree = ""; + }; + 69E810681B920D7E0061915A /* StringFromTimeIntervalDemoTests */ = { + isa = PBXGroup; + children = ( + 69E810691B920D7E0061915A /* StringFromTimeIntervalDemoTests.swift */, + 69E8106B1B920D7E0061915A /* Info.plist */, + ); + path = StringFromTimeIntervalDemoTests; + sourceTree = ""; + }; + 69E810731B920D7E0061915A /* StringFromTimeIntervalDemoUITests */ = { + isa = PBXGroup; + children = ( + 69E810741B920D7E0061915A /* StringFromTimeIntervalDemoUITests.swift */, + 69E810761B920D7E0061915A /* Info.plist */, + ); + path = StringFromTimeIntervalDemoUITests; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 69E810501B920D7E0061915A /* StringFromTimeIntervalDemo */ = { + isa = PBXNativeTarget; + buildConfigurationList = 69E810791B920D7E0061915A /* Build configuration list for PBXNativeTarget "StringFromTimeIntervalDemo" */; + buildPhases = ( + 69E8104D1B920D7E0061915A /* Sources */, + 69E8104E1B920D7E0061915A /* Frameworks */, + 69E8104F1B920D7E0061915A /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = StringFromTimeIntervalDemo; + productName = StringFromTimeIntervalDemo; + productReference = 69E810511B920D7E0061915A /* StringFromTimeIntervalDemo.app */; + productType = "com.apple.product-type.application"; + }; + 69E810641B920D7E0061915A /* StringFromTimeIntervalDemoTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 69E8107C1B920D7E0061915A /* Build configuration list for PBXNativeTarget "StringFromTimeIntervalDemoTests" */; + buildPhases = ( + 69E810611B920D7E0061915A /* Sources */, + 69E810621B920D7E0061915A /* Frameworks */, + 69E810631B920D7E0061915A /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 69E810671B920D7E0061915A /* PBXTargetDependency */, + ); + name = StringFromTimeIntervalDemoTests; + productName = StringFromTimeIntervalDemoTests; + productReference = 69E810651B920D7E0061915A /* StringFromTimeIntervalDemoTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 69E8106F1B920D7E0061915A /* StringFromTimeIntervalDemoUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 69E8107F1B920D7E0061915A /* Build configuration list for PBXNativeTarget "StringFromTimeIntervalDemoUITests" */; + buildPhases = ( + 69E8106C1B920D7E0061915A /* Sources */, + 69E8106D1B920D7E0061915A /* Frameworks */, + 69E8106E1B920D7E0061915A /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 69E810721B920D7E0061915A /* PBXTargetDependency */, + ); + name = StringFromTimeIntervalDemoUITests; + productName = StringFromTimeIntervalDemoUITests; + productReference = 69E810701B920D7E0061915A /* StringFromTimeIntervalDemoUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 69E810491B920D7E0061915A /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0700; + ORGANIZATIONNAME = dereknetto; + TargetAttributes = { + 69E810501B920D7E0061915A = { + CreatedOnToolsVersion = 7.0; + }; + 69E810641B920D7E0061915A = { + CreatedOnToolsVersion = 7.0; + TestTargetID = 69E810501B920D7E0061915A; + }; + 69E8106F1B920D7E0061915A = { + CreatedOnToolsVersion = 7.0; + TestTargetID = 69E810501B920D7E0061915A; + }; + }; + }; + buildConfigurationList = 69E8104C1B920D7E0061915A /* Build configuration list for PBXProject "StringFromTimeIntervalDemo" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 69E810481B920D7E0061915A; + productRefGroup = 69E810521B920D7E0061915A /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 69E810501B920D7E0061915A /* StringFromTimeIntervalDemo */, + 69E810641B920D7E0061915A /* StringFromTimeIntervalDemoTests */, + 69E8106F1B920D7E0061915A /* StringFromTimeIntervalDemoUITests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 69E8104F1B920D7E0061915A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 69E8105F1B920D7E0061915A /* LaunchScreen.storyboard in Resources */, + 69E8105C1B920D7E0061915A /* Assets.xcassets in Resources */, + 69E8105A1B920D7E0061915A /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 69E810631B920D7E0061915A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 69E8106E1B920D7E0061915A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 69E8104D1B920D7E0061915A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 69E810571B920D7E0061915A /* ViewController.swift in Sources */, + 69E810551B920D7E0061915A /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 69E810611B920D7E0061915A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 69E8106A1B920D7E0061915A /* StringFromTimeIntervalDemoTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 69E8106C1B920D7E0061915A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 69E810751B920D7E0061915A /* StringFromTimeIntervalDemoUITests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 69E810671B920D7E0061915A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 69E810501B920D7E0061915A /* StringFromTimeIntervalDemo */; + targetProxy = 69E810661B920D7E0061915A /* PBXContainerItemProxy */; + }; + 69E810721B920D7E0061915A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 69E810501B920D7E0061915A /* StringFromTimeIntervalDemo */; + targetProxy = 69E810711B920D7E0061915A /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 69E810581B920D7E0061915A /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 69E810591B920D7E0061915A /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 69E8105D1B920D7E0061915A /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 69E8105E1B920D7E0061915A /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 69E810771B920D7E0061915A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + 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 = 9.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 69E810781B920D7E0061915A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "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 = gnu99; + 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 = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 69E8107A1B920D7E0061915A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = StringFromTimeIntervalDemo/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = nyc.c4q.Derek316x.StringFromTimeIntervalDemo; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 69E8107B1B920D7E0061915A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = StringFromTimeIntervalDemo/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = nyc.c4q.Derek316x.StringFromTimeIntervalDemo; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 69E8107D1B920D7E0061915A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + INFOPLIST_FILE = StringFromTimeIntervalDemoTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = nyc.c4q.Derek316x.StringFromTimeIntervalDemoTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/StringFromTimeIntervalDemo.app/StringFromTimeIntervalDemo"; + }; + name = Debug; + }; + 69E8107E1B920D7E0061915A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + INFOPLIST_FILE = StringFromTimeIntervalDemoTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = nyc.c4q.Derek316x.StringFromTimeIntervalDemoTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/StringFromTimeIntervalDemo.app/StringFromTimeIntervalDemo"; + }; + name = Release; + }; + 69E810801B920D7E0061915A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = StringFromTimeIntervalDemoUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = nyc.c4q.Derek316x.StringFromTimeIntervalDemoUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_TARGET_NAME = StringFromTimeIntervalDemo; + USES_XCTRUNNER = YES; + }; + name = Debug; + }; + 69E810811B920D7E0061915A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = StringFromTimeIntervalDemoUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = nyc.c4q.Derek316x.StringFromTimeIntervalDemoUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_TARGET_NAME = StringFromTimeIntervalDemo; + USES_XCTRUNNER = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 69E8104C1B920D7E0061915A /* Build configuration list for PBXProject "StringFromTimeIntervalDemo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 69E810771B920D7E0061915A /* Debug */, + 69E810781B920D7E0061915A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 69E810791B920D7E0061915A /* Build configuration list for PBXNativeTarget "StringFromTimeIntervalDemo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 69E8107A1B920D7E0061915A /* Debug */, + 69E8107B1B920D7E0061915A /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; + 69E8107C1B920D7E0061915A /* Build configuration list for PBXNativeTarget "StringFromTimeIntervalDemoTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 69E8107D1B920D7E0061915A /* Debug */, + 69E8107E1B920D7E0061915A /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; + 69E8107F1B920D7E0061915A /* Build configuration list for PBXNativeTarget "StringFromTimeIntervalDemoUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 69E810801B920D7E0061915A /* Debug */, + 69E810811B920D7E0061915A /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; +/* End XCConfigurationList section */ + }; + rootObject = 69E810491B920D7E0061915A /* Project object */; +} diff --git a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..a5c6992 --- /dev/null +++ b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/AppDelegate.swift b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/AppDelegate.swift new file mode 100644 index 0000000..e8bc589 --- /dev/null +++ b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/AppDelegate.swift @@ -0,0 +1,46 @@ +// +// AppDelegate.swift +// StringFromTimeIntervalDemo +// +// Created by Z on 8/29/15. +// Copyright © 2015 dereknetto. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + + func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { + // Override point for customization after application launch. + return true + } + + func applicationWillResignActive(application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(application: UIApplication) { + // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + +} + diff --git a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/Assets.xcassets/AppIcon.appiconset/Contents.json b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..36d2c80 --- /dev/null +++ b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "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" : "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" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/Base.lproj/LaunchScreen.storyboard b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..78b9ef6 --- /dev/null +++ b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/Base.lproj/Main.storyboard b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/Base.lproj/Main.storyboard new file mode 100644 index 0000000..7e13c69 --- /dev/null +++ b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/Base.lproj/Main.storyboard @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/Info.plist b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/Info.plist new file mode 100644 index 0000000..40c6215 --- /dev/null +++ b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/Info.plist @@ -0,0 +1,47 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/ViewController.swift b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/ViewController.swift new file mode 100644 index 0000000..5369f5e --- /dev/null +++ b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/ViewController.swift @@ -0,0 +1,64 @@ +// +// ViewController.swift +// StringFromTimeIntervalDemo +// +// Created by Z on 8/29/15. +// Copyright © 2015 dereknetto. All rights reserved. +// + +import UIKit + +class ViewController: UIViewController { + + @IBOutlet weak var timeLabel: UILabel! + + @IBOutlet weak var timeTextField: UITextField! + + override func viewDidLoad() { + super.viewDidLoad() + // Do any additional setup after loading the view, typically from a nib. + } + + + @IBAction func convertTimeButton(sender: AnyObject) { + if let timeInput = timeTextField.text{ + timeLabel.text = stringFromTimeInterval((timeInput as NSString).doubleValue) + } + } + + func stringFromTimeInterval(interval: CFTimeInterval) -> String{ + let intInterval = Int(interval) + + let years = (intInterval / 31556900) + let months = (intInterval / 2629740) % 12 + let days = (intInterval / (3600 * 24)) % 365 + let hours = (intInterval / 3600) % 24 + let minutes = (intInterval / 60) % 60 + let seconds = intInterval % 60 + let milliseconds = Int(floor(((interval - floor(interval)) * 100))) + + let timeUnits = [years, months, days, hours, minutes, seconds, milliseconds] + + var foundFirstNonzero = false + var timeString = "" + + // remove leading 0s + for (idx, unit) in timeUnits.enumerate() { + if unit == 0 && !foundFirstNonzero { + continue + } + foundFirstNonzero = true + let unitString = unit > 9 ? "\(unit)" : "0\(unit)" + if idx == timeUnits.count - 1 { + timeString = timeString + unitString + } else { + timeString = timeString + unitString + ":" + } + } + + return timeString + } + + +} + diff --git a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemoTests/Info.plist b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemoTests/Info.plist new file mode 100644 index 0000000..ba72822 --- /dev/null +++ b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemoTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemoTests/StringFromTimeIntervalDemoTests.swift b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemoTests/StringFromTimeIntervalDemoTests.swift new file mode 100644 index 0000000..d65ef55 --- /dev/null +++ b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemoTests/StringFromTimeIntervalDemoTests.swift @@ -0,0 +1,35 @@ +// +// StringFromTimeIntervalDemoTests.swift +// StringFromTimeIntervalDemoTests +// +// Created by Z on 8/29/15. +// Copyright © 2015 dereknetto. All rights reserved. +// + +import XCTest + +class StringFromTimeIntervalDemoTests: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testPerformanceExample() { + // This is an example of a performance test case. + self.measureBlock() { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemoUITests/Info.plist b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemoUITests/Info.plist new file mode 100644 index 0000000..ba72822 --- /dev/null +++ b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemoUITests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemoUITests/StringFromTimeIntervalDemoUITests.swift b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemoUITests/StringFromTimeIntervalDemoUITests.swift new file mode 100644 index 0000000..63e1acc --- /dev/null +++ b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemoUITests/StringFromTimeIntervalDemoUITests.swift @@ -0,0 +1,35 @@ +// +// StringFromTimeIntervalDemoUITests.swift +// StringFromTimeIntervalDemoUITests +// +// Created by Z on 8/29/15. +// Copyright © 2015 dereknetto. All rights reserved. +// + +import Foundation +import XCTest + +class StringFromTimeIntervalDemoUITests: XCTestCase { + + override func setUp() { + super.setUp() + + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. + XCUIApplication().launch() + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // Use recording to get started writing UI tests. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + +} diff --git a/Timer Demo/Timer Demo.xcodeproj/project.pbxproj b/Timer Demo/Timer Demo.xcodeproj/project.pbxproj index d197a8d..b1b397d 100644 --- a/Timer Demo/Timer Demo.xcodeproj/project.pbxproj +++ b/Timer Demo/Timer Demo.xcodeproj/project.pbxproj @@ -10,7 +10,6 @@ 5016E10C1B89209300C5EFFD /* TableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5016E10B1B89209300C5EFFD /* TableViewCell.swift */; }; 504DC2291B8FE3E30071A35E /* StopwatchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504DC2281B8FE3E30071A35E /* StopwatchViewController.swift */; }; 504DC22B1B91FD8A0071A35E /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 504DC22A1B91FD8A0071A35E /* AVFoundation.framework */; }; - 504DC22D1B91FE9F0071A35E /* LoudAlarmClockBuzzer.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = 504DC22C1B91FE9F0071A35E /* LoudAlarmClockBuzzer.mp3 */; }; 6981737C1B88EFF0000D38F2 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6981737B1B88EFF0000D38F2 /* AppDelegate.swift */; }; 6981737E1B88EFF0000D38F2 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6981737D1B88EFF0000D38F2 /* ViewController.swift */; }; 698173811B88EFF0000D38F2 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6981737F1B88EFF0000D38F2 /* Main.storyboard */; }; @@ -44,7 +43,6 @@ 5016E10B1B89209300C5EFFD /* TableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableViewCell.swift; sourceTree = ""; }; 504DC2281B8FE3E30071A35E /* StopwatchViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StopwatchViewController.swift; sourceTree = ""; }; 504DC22A1B91FD8A0071A35E /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; - 504DC22C1B91FE9F0071A35E /* LoudAlarmClockBuzzer.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; name = LoudAlarmClockBuzzer.mp3; path = ../../../../../../../../Downloads/LoudAlarmClockBuzzer.mp3; sourceTree = ""; }; 698173781B88EFF0000D38F2 /* Timer Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Timer Demo.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 6981737B1B88EFF0000D38F2 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 6981737D1B88EFF0000D38F2 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; @@ -113,7 +111,6 @@ 6981737A1B88EFF0000D38F2 /* Timer Demo */ = { isa = PBXGroup; children = ( - 504DC22C1B91FE9F0071A35E /* LoudAlarmClockBuzzer.mp3 */, 6981737B1B88EFF0000D38F2 /* AppDelegate.swift */, 698173A91B88F28C000D38F2 /* Timer.swift */, 5016E10B1B89209300C5EFFD /* TableViewCell.swift */, @@ -251,7 +248,6 @@ buildActionMask = 2147483647; files = ( 698173861B88EFF0000D38F2 /* LaunchScreen.storyboard in Resources */, - 504DC22D1B91FE9F0071A35E /* LoudAlarmClockBuzzer.mp3 in Resources */, 698173831B88EFF0000D38F2 /* Assets.xcassets in Resources */, 698173811B88EFF0000D38F2 /* Main.storyboard in Resources */, ); diff --git a/Timer Demo/Timer Demo/Timer.swift b/Timer Demo/Timer Demo/Timer.swift index 23062fb..baebd66 100644 --- a/Timer Demo/Timer Demo/Timer.swift +++ b/Timer Demo/Timer Demo/Timer.swift @@ -51,7 +51,9 @@ class Timer: NSObject { var timeString = "" for unit in timeUnits{ let unitString = unit > 9 ? "\(unit)" : "0\(unit)" + if unit > 0 { timeString = timeString + unitString + ":" + } } return timeString diff --git a/Timer Demo/Timer Demo/ViewController.swift b/Timer Demo/Timer Demo/ViewController.swift index be358ae..d382dee 100644 --- a/Timer Demo/Timer Demo/ViewController.swift +++ b/Timer Demo/Timer Demo/ViewController.swift @@ -26,13 +26,13 @@ class ViewController: UIViewController, UITableViewDataSource, UITableViewDelega override func viewDidLoad() { super.viewDidLoad() - let alertSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("LoudAlarmClockBuzzer", ofType: "mp3")!) - - do { - try audioPlayer = AVAudioPlayer(contentsOfURL: alertSound) - } catch { - print("Error") - } +// let alertSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("LoudAlarmClockBuzzer", ofType: "mp3")!) +// +// do { +// try audioPlayer = AVAudioPlayer(contentsOfURL: alertSound) +// } catch { +// print("Error") +// } audioPlayer.numberOfLoops = -1 audioPlayer.prepareToPlay() From d9ee107a7ed7098c264d9c74ca9f1cffdfc8badc Mon Sep 17 00:00:00 2001 From: JovannyEspinal Date: Sat, 29 Aug 2015 12:34:29 -0400 Subject: [PATCH 42/79] Commit --- .../Timer Demo/Base.lproj/Main.storyboard | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard index 524b3ed..3c3ac43 100644 --- a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard +++ b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard @@ -204,6 +204,7 @@ + @@ -212,10 +213,31 @@ + + + + + + + + + + + + + + + + + + + + + + - From 586248a528316eb3b5c1ce25d56a234b75bfea02 Mon Sep 17 00:00:00 2001 From: Derek316x Date: Sat, 29 Aug 2015 12:56:20 -0400 Subject: [PATCH 43/79] r --- .../Timer Demo.xcodeproj/project.pbxproj | 14 +--- .../Timer Demo/Base.lproj/Main.storyboard | 24 ++++++- Timer Demo/Timer Demo/Timer.swift | 67 ++++++++++--------- 3 files changed, 60 insertions(+), 45 deletions(-) diff --git a/Timer Demo/Timer Demo.xcodeproj/project.pbxproj b/Timer Demo/Timer Demo.xcodeproj/project.pbxproj index 54941a2..b7ce6b5 100644 --- a/Timer Demo/Timer Demo.xcodeproj/project.pbxproj +++ b/Timer Demo/Timer Demo.xcodeproj/project.pbxproj @@ -10,10 +10,7 @@ 5016E10C1B89209300C5EFFD /* TableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5016E10B1B89209300C5EFFD /* TableViewCell.swift */; }; 504DC2291B8FE3E30071A35E /* StopwatchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504DC2281B8FE3E30071A35E /* StopwatchViewController.swift */; }; 504DC22B1B91FD8A0071A35E /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 504DC22A1B91FD8A0071A35E /* AVFoundation.framework */; }; -<<<<<<< HEAD -======= - 504DC22F1B920D210071A35E /* LoudAlarmClockBuzzer.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = 504DC22E1B920D210071A35E /* LoudAlarmClockBuzzer.mp3 */; }; ->>>>>>> bca8192be3c7dd10ecfa16c74dcae720746f49dd + 6981737C1B88EFF0000D38F2 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6981737B1B88EFF0000D38F2 /* AppDelegate.swift */; }; 6981737E1B88EFF0000D38F2 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6981737D1B88EFF0000D38F2 /* ViewController.swift */; }; 698173811B88EFF0000D38F2 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6981737F1B88EFF0000D38F2 /* Main.storyboard */; }; @@ -46,10 +43,7 @@ 5016E10B1B89209300C5EFFD /* TableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableViewCell.swift; sourceTree = ""; }; 504DC2281B8FE3E30071A35E /* StopwatchViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StopwatchViewController.swift; sourceTree = ""; }; 504DC22A1B91FD8A0071A35E /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; -<<<<<<< HEAD -======= - 504DC22E1B920D210071A35E /* LoudAlarmClockBuzzer.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = LoudAlarmClockBuzzer.mp3; sourceTree = ""; }; ->>>>>>> bca8192be3c7dd10ecfa16c74dcae720746f49dd + 698173781B88EFF0000D38F2 /* Timer Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Timer Demo.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 6981737B1B88EFF0000D38F2 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 6981737D1B88EFF0000D38F2 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; @@ -254,10 +248,6 @@ buildActionMask = 2147483647; files = ( 698173861B88EFF0000D38F2 /* LaunchScreen.storyboard in Resources */, -<<<<<<< HEAD -======= - 504DC22F1B920D210071A35E /* LoudAlarmClockBuzzer.mp3 in Resources */, ->>>>>>> bca8192be3c7dd10ecfa16c74dcae720746f49dd 698173831B88EFF0000D38F2 /* Assets.xcassets in Resources */, 698173811B88EFF0000D38F2 /* Main.storyboard in Resources */, ); diff --git a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard index 524b3ed..3c3ac43 100644 --- a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard +++ b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard @@ -204,6 +204,7 @@ + @@ -212,10 +213,31 @@ + + + + + + + + + + + + + + + + + + + + + + - diff --git a/Timer Demo/Timer Demo/Timer.swift b/Timer Demo/Timer Demo/Timer.swift index b8d95e3..6eedfc8 100644 --- a/Timer Demo/Timer Demo/Timer.swift +++ b/Timer Demo/Timer Demo/Timer.swift @@ -22,50 +22,53 @@ class Timer: NSObject { self.timerName = timerLabel } - func stringFromTimeInterval(interval: CFTimeInterval) -> String{ + func stringFromTimeInterval(interval: CFTimeInterval, withMilliseconds:Bool = true) -> String{ let intInterval = Int(interval) + + let years = (intInterval / 31556900) + let months = (intInterval / 2629740) % 12 + let days = (intInterval / (3600 * 24)) % 365 + let hours = (intInterval / 3600) % 24 let minutes = (intInterval / 60) % 60 let seconds = intInterval % 60 let milliseconds = Int(floor(((interval - floor(interval)) * 100))) - let minutesString = minutes > 9 ? "\(minutes)" : "0\(minutes)" - let secondsString = seconds > 9 ? "\(seconds)" : "0\(seconds)" - let millisecondsString = milliseconds > 9 ? "\(milliseconds)" : "0\(milliseconds)" + let timeUnits = [years, months, days, hours, minutes, seconds, milliseconds] -<<<<<<< HEAD + var foundFirstNonzero = false var timeString = "" - for unit in timeUnits{ + + // remove leading 0s + for (idx, unit) in timeUnits.enumerate() { + if unit == 0 && !foundFirstNonzero { + continue + } + foundFirstNonzero = true let unitString = unit > 9 ? "\(unit)" : "0\(unit)" - if unit > 0 { - timeString = timeString + unitString + ":" + + if (withMilliseconds == true){ + if idx == timeUnits.count - 1 { + timeString = timeString + unitString + } + else if (idx == timeUnits.count - 2){ + timeString = timeString + unitString + "." + }else{ + timeString = timeString + unitString + ":" + } + }else{ + if idx == timeUnits.count - 1 { + //do nothing + } + else if (idx == timeUnits.count - 2){ + timeString = timeString + unitString + }else{ + timeString = timeString + unitString + ":" + } } + } -======= - let timeString = minutesString + ":" + secondsString + "." + millisecondsString ->>>>>>> bca8192be3c7dd10ecfa16c74dcae720746f49dd return timeString } -// func stringFromTimeInterval(interval: CFTimeInterval) -> String{ -// let intInterval = Int(interval) -// -// let years = (intInterval / 31556900) -// let months = (intInterval / 2629740) % 12 -// let days = (intInterval / (3600 * 24)) % 365 -// let hours = (intInterval / 3600) % 24 -// let minutes = (intInterval / 60) % 60 -// let seconds = intInterval % 60 -// let milliseconds = Int(floor(((interval - floor(interval)) * 100))) -// -// let timeUnits = [years, months, days, hours, minutes, seconds, milliseconds] -// -// var timeString = "" -// for unit in timeUnits{ -// let unitString = unit > 9 ? "\(unit)" : "0\(unit)" -// timeString = timeString + unitString + ":" -// } -// -// return timeString -// } } From 27b4fab3c61d3ebfc405b2091888fca149a793cd Mon Sep 17 00:00:00 2001 From: JovannyEspinal Date: Sat, 29 Aug 2015 12:57:31 -0400 Subject: [PATCH 44/79] Storyboard fix --- Timer Demo/Timer Demo/Base.lproj/Main.storyboard | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard index 3c3ac43..512e848 100644 --- a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard +++ b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard @@ -189,7 +189,7 @@ - + @@ -199,7 +199,7 @@ - + @@ -219,7 +219,7 @@ - + @@ -236,10 +236,12 @@ - + + + - + From 9db0a4083fa48134c34edfb453d29bfe58199aac Mon Sep 17 00:00:00 2001 From: Derek316x Date: Sat, 29 Aug 2015 14:04:32 -0400 Subject: [PATCH 45/79] b --- Timer Demo/Timer Demo/Base.lproj/Main.storyboard | 8 +++----- Timer Demo/Timer Demo/ViewController.swift | 1 - 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard index 511f12e..c6e65b9 100644 --- a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard +++ b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard @@ -1,7 +1,7 @@ - + - + @@ -204,7 +204,6 @@ - @@ -219,7 +218,6 @@ - @@ -237,11 +235,11 @@ - + diff --git a/Timer Demo/Timer Demo/ViewController.swift b/Timer Demo/Timer Demo/ViewController.swift index 25c6f8f..00063c9 100644 --- a/Timer Demo/Timer Demo/ViewController.swift +++ b/Timer Demo/Timer Demo/ViewController.swift @@ -52,7 +52,6 @@ class ViewController: UIViewController, UITableViewDataSource, UITableViewDelega timer.remainingTime = timer.remainingTime - displayLink.duration print("Remaining time: \(timer.remainingTime)") - } func update(){ From 9fbb5370069432e7ed9a5e9129c4bf13f8c8d153 Mon Sep 17 00:00:00 2001 From: Derek316x Date: Sat, 29 Aug 2015 14:08:15 -0400 Subject: [PATCH 46/79] f --- Timer Demo/Timer Demo/Base.lproj/Main.storyboard | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard index c6e65b9..ccb0c5c 100644 --- a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard +++ b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard @@ -29,6 +29,7 @@ + @@ -37,13 +38,20 @@ + + + - - + From d5c46e1f335c045c8f4ecf3982f7b9969413396f Mon Sep 17 00:00:00 2001 From: JovannyEspinal Date: Sat, 29 Aug 2015 14:06:13 -0400 Subject: [PATCH 47/79] Fixed alarm --- Timer Demo/Timer Demo.xcodeproj/project.pbxproj | 7 ++++--- Timer Demo/Timer Demo/ViewController.swift | 14 +++++++------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/Timer Demo/Timer Demo.xcodeproj/project.pbxproj b/Timer Demo/Timer Demo.xcodeproj/project.pbxproj index b7ce6b5..e23fe0f 100644 --- a/Timer Demo/Timer Demo.xcodeproj/project.pbxproj +++ b/Timer Demo/Timer Demo.xcodeproj/project.pbxproj @@ -10,7 +10,7 @@ 5016E10C1B89209300C5EFFD /* TableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5016E10B1B89209300C5EFFD /* TableViewCell.swift */; }; 504DC2291B8FE3E30071A35E /* StopwatchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504DC2281B8FE3E30071A35E /* StopwatchViewController.swift */; }; 504DC22B1B91FD8A0071A35E /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 504DC22A1B91FD8A0071A35E /* AVFoundation.framework */; }; - + 504DC2311B922AB60071A35E /* LoudAlarmClockBuzzer.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = 504DC2301B922AB60071A35E /* LoudAlarmClockBuzzer.mp3 */; }; 6981737C1B88EFF0000D38F2 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6981737B1B88EFF0000D38F2 /* AppDelegate.swift */; }; 6981737E1B88EFF0000D38F2 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6981737D1B88EFF0000D38F2 /* ViewController.swift */; }; 698173811B88EFF0000D38F2 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6981737F1B88EFF0000D38F2 /* Main.storyboard */; }; @@ -43,7 +43,7 @@ 5016E10B1B89209300C5EFFD /* TableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableViewCell.swift; sourceTree = ""; }; 504DC2281B8FE3E30071A35E /* StopwatchViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StopwatchViewController.swift; sourceTree = ""; }; 504DC22A1B91FD8A0071A35E /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; - + 504DC2301B922AB60071A35E /* LoudAlarmClockBuzzer.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = LoudAlarmClockBuzzer.mp3; sourceTree = ""; }; 698173781B88EFF0000D38F2 /* Timer Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Timer Demo.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 6981737B1B88EFF0000D38F2 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 6981737D1B88EFF0000D38F2 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; @@ -113,11 +113,11 @@ children = ( 6981737B1B88EFF0000D38F2 /* AppDelegate.swift */, 698173A91B88F28C000D38F2 /* Timer.swift */, - 504DC22E1B920D210071A35E /* LoudAlarmClockBuzzer.mp3 */, 5016E10B1B89209300C5EFFD /* TableViewCell.swift */, 6981737D1B88EFF0000D38F2 /* ViewController.swift */, 504DC2281B8FE3E30071A35E /* StopwatchViewController.swift */, 69E810421B91FD170061915A /* CountdownViewController.swift */, + 504DC2301B922AB60071A35E /* LoudAlarmClockBuzzer.mp3 */, 6981737F1B88EFF0000D38F2 /* Main.storyboard */, 698173821B88EFF0000D38F2 /* Assets.xcassets */, 698173841B88EFF0000D38F2 /* LaunchScreen.storyboard */, @@ -248,6 +248,7 @@ buildActionMask = 2147483647; files = ( 698173861B88EFF0000D38F2 /* LaunchScreen.storyboard in Resources */, + 504DC2311B922AB60071A35E /* LoudAlarmClockBuzzer.mp3 in Resources */, 698173831B88EFF0000D38F2 /* Assets.xcassets in Resources */, 698173811B88EFF0000D38F2 /* Main.storyboard in Resources */, ); diff --git a/Timer Demo/Timer Demo/ViewController.swift b/Timer Demo/Timer Demo/ViewController.swift index 00063c9..0ae67a3 100644 --- a/Timer Demo/Timer Demo/ViewController.swift +++ b/Timer Demo/Timer Demo/ViewController.swift @@ -26,13 +26,13 @@ class ViewController: UIViewController, UITableViewDataSource, UITableViewDelega override func viewDidLoad() { super.viewDidLoad() -// let alertSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("LoudAlarmClockBuzzer", ofType: "mp3")!) -// -// do { -// try audioPlayer = AVAudioPlayer(contentsOfURL: alertSound) -// } catch { -// print("Error") -// } + let alertSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("LoudAlarmClockBuzzer", ofType: "mp3")!) + + do { + try audioPlayer = AVAudioPlayer(contentsOfURL: alertSound) + } catch { + print("Error") + } audioPlayer.numberOfLoops = -1 audioPlayer.prepareToPlay() From c4464988c9829d241bf7f05870c0afab2aba3b6d Mon Sep 17 00:00:00 2001 From: JovannyEspinal Date: Sat, 29 Aug 2015 15:29:15 -0400 Subject: [PATCH 48/79] Fixed transition between Add Timer VC and Timer VC --- Timer Demo/AddTimerViewController.swift | 95 +++++++++++++++++++ .../Timer Demo.xcodeproj/project.pbxproj | 4 + .../Timer Demo/Base.lproj/Main.storyboard | 24 +++-- Timer Demo/Timer Demo/ViewController.swift | 3 - 4 files changed, 115 insertions(+), 11 deletions(-) create mode 100644 Timer Demo/AddTimerViewController.swift diff --git a/Timer Demo/AddTimerViewController.swift b/Timer Demo/AddTimerViewController.swift new file mode 100644 index 0000000..df4b229 --- /dev/null +++ b/Timer Demo/AddTimerViewController.swift @@ -0,0 +1,95 @@ +// +// AddTimerViewController.swift +// Timer Demo +// +// Created by Jovanny Espinal on 8/29/15. +// Copyright © 2015 dereknetto. All rights reserved. +// + +import UIKit + +class AddTimerViewController: UIViewController { + + @IBOutlet weak var timerNameField: UITextField! + @IBOutlet weak var timerPicker: UIDatePicker! + + + override func viewDidLoad() { + super.viewDidLoad() + + + + // Do any additional setup after loading the view. + } + + + func stringFromTimeInterval(interval: CFTimeInterval, withMilliseconds:Bool = true) -> String{ + let intInterval = Int(interval) + + let years = (intInterval / 31556900) + let months = (intInterval / 2629740) % 12 + let days = (intInterval / (3600 * 24)) % 365 + let hours = (intInterval / 3600) % 24 + let minutes = (intInterval / 60) % 60 + let seconds = intInterval % 60 + let milliseconds = Int(floor(((interval - floor(interval)) * 100))) + + let timeUnits = [years, months, days, hours, minutes, seconds, milliseconds] + + var foundFirstNonzero = false + var timeString = "" + + // remove leading 0s + for (idx, unit) in timeUnits.enumerate() { + if unit == 0 && !foundFirstNonzero { + continue + } + foundFirstNonzero = true + let unitString = unit > 9 ? "\(unit)" : "0\(unit)" + + if (withMilliseconds == true){ + if idx == timeUnits.count - 1 { + timeString = timeString + unitString + } + else if (idx == timeUnits.count - 2){ + timeString = timeString + unitString + "." + }else{ + timeString = timeString + unitString + ":" + } + }else{ + if idx == timeUnits.count - 1 { + //do nothing + } + else if (idx == timeUnits.count - 2){ + timeString = timeString + unitString + }else{ + timeString = timeString + unitString + ":" + } + } + + } + + return timeString + } + + @IBAction func addTimer(sender: UIBarButtonItem) { + + + + print("\(stringFromTimeInterval(timerPicker.countDownDuration, withMilliseconds: false))") + + self.navigationController?.popViewControllerAnimated(true) + + } + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/Timer Demo/Timer Demo.xcodeproj/project.pbxproj b/Timer Demo/Timer Demo.xcodeproj/project.pbxproj index e23fe0f..bda160b 100644 --- a/Timer Demo/Timer Demo.xcodeproj/project.pbxproj +++ b/Timer Demo/Timer Demo.xcodeproj/project.pbxproj @@ -11,6 +11,7 @@ 504DC2291B8FE3E30071A35E /* StopwatchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504DC2281B8FE3E30071A35E /* StopwatchViewController.swift */; }; 504DC22B1B91FD8A0071A35E /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 504DC22A1B91FD8A0071A35E /* AVFoundation.framework */; }; 504DC2311B922AB60071A35E /* LoudAlarmClockBuzzer.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = 504DC2301B922AB60071A35E /* LoudAlarmClockBuzzer.mp3 */; }; + 504DC2331B922CF30071A35E /* AddTimerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504DC2321B922CF30071A35E /* AddTimerViewController.swift */; }; 6981737C1B88EFF0000D38F2 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6981737B1B88EFF0000D38F2 /* AppDelegate.swift */; }; 6981737E1B88EFF0000D38F2 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6981737D1B88EFF0000D38F2 /* ViewController.swift */; }; 698173811B88EFF0000D38F2 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6981737F1B88EFF0000D38F2 /* Main.storyboard */; }; @@ -44,6 +45,7 @@ 504DC2281B8FE3E30071A35E /* StopwatchViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StopwatchViewController.swift; sourceTree = ""; }; 504DC22A1B91FD8A0071A35E /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; 504DC2301B922AB60071A35E /* LoudAlarmClockBuzzer.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = LoudAlarmClockBuzzer.mp3; sourceTree = ""; }; + 504DC2321B922CF30071A35E /* AddTimerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AddTimerViewController.swift; path = ../AddTimerViewController.swift; sourceTree = ""; }; 698173781B88EFF0000D38F2 /* Timer Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Timer Demo.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 6981737B1B88EFF0000D38F2 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 6981737D1B88EFF0000D38F2 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; @@ -117,6 +119,7 @@ 6981737D1B88EFF0000D38F2 /* ViewController.swift */, 504DC2281B8FE3E30071A35E /* StopwatchViewController.swift */, 69E810421B91FD170061915A /* CountdownViewController.swift */, + 504DC2321B922CF30071A35E /* AddTimerViewController.swift */, 504DC2301B922AB60071A35E /* LoudAlarmClockBuzzer.mp3 */, 6981737F1B88EFF0000D38F2 /* Main.storyboard */, 698173821B88EFF0000D38F2 /* Assets.xcassets */, @@ -281,6 +284,7 @@ 504DC2291B8FE3E30071A35E /* StopwatchViewController.swift in Sources */, 6981737E1B88EFF0000D38F2 /* ViewController.swift in Sources */, 6981737C1B88EFF0000D38F2 /* AppDelegate.swift in Sources */, + 504DC2331B922CF30071A35E /* AddTimerViewController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard index ccb0c5c..1de7996 100644 --- a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard +++ b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard @@ -1,7 +1,7 @@ - + - + @@ -209,10 +209,10 @@ - + - + @@ -222,12 +222,12 @@ - + - - + + @@ -244,8 +244,16 @@ - + + + + + + + + + diff --git a/Timer Demo/Timer Demo/ViewController.swift b/Timer Demo/Timer Demo/ViewController.swift index 0ae67a3..c9043e0 100644 --- a/Timer Demo/Timer Demo/ViewController.swift +++ b/Timer Demo/Timer Demo/ViewController.swift @@ -12,15 +12,12 @@ import AVFoundation class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { - // @IBOutlet weak var timerLabel: UILabel! - // @IBOutlet weak var startPauseButton: UIButton! @IBOutlet weak var tableView: UITableView! var displayLink : CADisplayLink! var timers: [Timer] = []; let popcornTimer = Timer.init(timerLabel: "Popcorn", startTime: 4.000) let poopTimer = Timer.init(timerLabel: "Poop", startTime: 3.000) - var audioPlayer = AVAudioPlayer() override func viewDidLoad() { From 0665cd457a147e3bb86e429fc64ce868a89993eb Mon Sep 17 00:00:00 2001 From: Derek316x Date: Sat, 29 Aug 2015 15:49:47 -0400 Subject: [PATCH 49/79] nstimeinterval extension done --- Countdown/Countdown.xcodeproj/project.pbxproj | 15 +++-- .../Countdown/Base.lproj/Main.storyboard | 47 ++++++++++++--- .../Countdown/CountdownViewController.swift | 47 +++++++++++++++ Countdown/Countdown/TimeUtilities.swift | 60 +++++++++++++++++++ Countdown/Countdown/ViewController.swift | 18 ------ .../Timer Demo/Base.lproj/Main.storyboard | 2 +- 6 files changed, 157 insertions(+), 32 deletions(-) create mode 100644 Countdown/Countdown/CountdownViewController.swift create mode 100644 Countdown/Countdown/TimeUtilities.swift delete mode 100644 Countdown/Countdown/ViewController.swift diff --git a/Countdown/Countdown.xcodeproj/project.pbxproj b/Countdown/Countdown.xcodeproj/project.pbxproj index 1886672..c311c32 100644 --- a/Countdown/Countdown.xcodeproj/project.pbxproj +++ b/Countdown/Countdown.xcodeproj/project.pbxproj @@ -7,8 +7,9 @@ objects = { /* Begin PBXBuildFile section */ + 69713F411B922D2E00FCEA28 /* CountdownViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69713F401B922D2E00FCEA28 /* CountdownViewController.swift */; }; + 69713F431B923F8E00FCEA28 /* TimeUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69713F421B923F8E00FCEA28 /* TimeUtilities.swift */; }; 69E810151B91F6B30061915A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69E810141B91F6B30061915A /* AppDelegate.swift */; }; - 69E810171B91F6B30061915A /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69E810161B91F6B30061915A /* ViewController.swift */; }; 69E8101A1B91F6B30061915A /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 69E810181B91F6B30061915A /* Main.storyboard */; }; 69E8101C1B91F6B30061915A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 69E8101B1B91F6B30061915A /* Assets.xcassets */; }; 69E8101F1B91F6B30061915A /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 69E8101D1B91F6B30061915A /* LaunchScreen.storyboard */; }; @@ -34,9 +35,10 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 69713F401B922D2E00FCEA28 /* CountdownViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CountdownViewController.swift; sourceTree = ""; }; + 69713F421B923F8E00FCEA28 /* TimeUtilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TimeUtilities.swift; sourceTree = ""; }; 69E810111B91F6B30061915A /* Countdown.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Countdown.app; sourceTree = BUILT_PRODUCTS_DIR; }; 69E810141B91F6B30061915A /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 69E810161B91F6B30061915A /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 69E810191B91F6B30061915A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 69E8101B1B91F6B30061915A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 69E8101E1B91F6B30061915A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; @@ -98,7 +100,8 @@ isa = PBXGroup; children = ( 69E810141B91F6B30061915A /* AppDelegate.swift */, - 69E810161B91F6B30061915A /* ViewController.swift */, + 69713F421B923F8E00FCEA28 /* TimeUtilities.swift */, + 69713F401B922D2E00FCEA28 /* CountdownViewController.swift */, 69E810181B91F6B30061915A /* Main.storyboard */, 69E8101B1B91F6B30061915A /* Assets.xcassets */, 69E8101D1B91F6B30061915A /* LaunchScreen.storyboard */, @@ -255,7 +258,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 69E810171B91F6B30061915A /* ViewController.swift in Sources */, + 69713F411B922D2E00FCEA28 /* CountdownViewController.swift in Sources */, + 69713F431B923F8E00FCEA28 /* TimeUtilities.swift in Sources */, 69E810151B91F6B30061915A /* AppDelegate.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -483,6 +487,7 @@ 69E8103B1B91F6B30061915A /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; 69E8103C1B91F6B30061915A /* Build configuration list for PBXNativeTarget "CountdownTests" */ = { isa = XCConfigurationList; @@ -491,6 +496,7 @@ 69E8103E1B91F6B30061915A /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; 69E8103F1B91F6B30061915A /* Build configuration list for PBXNativeTarget "CountdownUITests" */ = { isa = XCConfigurationList; @@ -499,6 +505,7 @@ 69E810411B91F6B30061915A /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; diff --git a/Countdown/Countdown/Base.lproj/Main.storyboard b/Countdown/Countdown/Base.lproj/Main.storyboard index cd65520..7e4aebe 100644 --- a/Countdown/Countdown/Base.lproj/Main.storyboard +++ b/Countdown/Countdown/Base.lproj/Main.storyboard @@ -1,25 +1,54 @@ - + - - + + - + - - + + - + - + + + + + + + + + + + + + + + + + + + + + + + + - + + diff --git a/Countdown/Countdown/CountdownViewController.swift b/Countdown/Countdown/CountdownViewController.swift new file mode 100644 index 0000000..4f64179 --- /dev/null +++ b/Countdown/Countdown/CountdownViewController.swift @@ -0,0 +1,47 @@ +// +// CountdownViewController.swift +// Countdown +// +// Created by Z on 8/29/15. +// Copyright © 2015 dereknetto. All rights reserved. +// + +import UIKit + +class CountdownViewController: UIViewController { + + + @IBOutlet weak var timeToTargetDateLabel: UILabel! + @IBOutlet weak var datePicker: UIDatePicker! + + var displayLink : CADisplayLink! + var targetDate = NSDate() + + override func viewDidLoad() { + displayLink = CADisplayLink(target: self, selector: Selector("updateTimeToTargetDate")) + displayLink.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes) + } + + @IBAction func datePickerValueChanged(sender: UIDatePicker) { + targetDate = datePicker.date + updateTimeToTargetDate() + } + + func updateTimeToTargetDate(){ + let currentDate = NSDate() + let timeToTargetDate = targetDate.timeIntervalSinceDate(currentDate) + timeToTargetDateLabel.text = timeToTargetDate.stringFromTimeInterval(false) + } + + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/Countdown/Countdown/TimeUtilities.swift b/Countdown/Countdown/TimeUtilities.swift new file mode 100644 index 0000000..6448745 --- /dev/null +++ b/Countdown/Countdown/TimeUtilities.swift @@ -0,0 +1,60 @@ +// +// TimeUtilities.swift +// Countdown +// +// Created by Z on 8/29/15. +// Copyright © 2015 dereknetto. All rights reserved. +// + +import UIKit + +extension NSTimeInterval{ + + func stringFromTimeInterval(withMilliseconds:Bool) -> String{ + + let years = (self / 31556900) + let months = (self / 2629740) % 12 + let days = (self / (3600 * 24)) % 365 + let hours = (self / 3600) % 24 + let minutes = (self / 60) % 60 + let seconds = self % 60 + let milliseconds = Double(Int(floor(((self - floor(self)) * 100)))) + + let timeUnits: [NSTimeInterval] = [years, months, days, hours, minutes, seconds, milliseconds] + + var foundFirstNonzero = false + var timeString = "" + + // remove leading 0s + for (idx, unit) in timeUnits.enumerate() { + if unit == 0 && !foundFirstNonzero { + continue + } + foundFirstNonzero = true + let unitString = unit > 9 ? "\(unit)" : "0\(unit)" + + if (withMilliseconds == true){ + if idx == timeUnits.count - 1 { + timeString = timeString + unitString + } + else if (idx == timeUnits.count - 2){ + timeString = timeString + unitString + "." + }else{ + timeString = timeString + unitString + ":" + } + }else{ + if idx == timeUnits.count - 1 { + //do nothing + } + else if (idx == timeUnits.count - 2){ + timeString = timeString + unitString + }else{ + timeString = timeString + unitString + ":" + } + } + } + + return timeString + } + +} diff --git a/Countdown/Countdown/ViewController.swift b/Countdown/Countdown/ViewController.swift deleted file mode 100644 index ecbb46d..0000000 --- a/Countdown/Countdown/ViewController.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// ViewController.swift -// Countdown -// -// Created by Z on 8/29/15. -// Copyright © 2015 dereknetto. All rights reserved. -// - -import UIKit - -class ViewController: UIViewController { - - override func viewDidLoad() { - super.viewDidLoad() - } - -} - diff --git a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard index 1de7996..0337972 100644 --- a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard +++ b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard @@ -29,7 +29,6 @@ - @@ -50,6 +49,7 @@ + From f19686e457c42b4a229f8e02af5f40014d8d2995 Mon Sep 17 00:00:00 2001 From: JovannyEspinal Date: Sat, 29 Aug 2015 15:51:49 -0400 Subject: [PATCH 50/79] Eh --- Timer Demo/AddTimerViewController.swift | 9 +++++++++ Timer Demo/Timer Demo/Base.lproj/Main.storyboard | 4 ++-- Timer Demo/Timer Demo/ViewController.swift | 3 --- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Timer Demo/AddTimerViewController.swift b/Timer Demo/AddTimerViewController.swift index df4b229..a65419f 100644 --- a/Timer Demo/AddTimerViewController.swift +++ b/Timer Demo/AddTimerViewController.swift @@ -12,6 +12,8 @@ class AddTimerViewController: UIViewController { @IBOutlet weak var timerNameField: UITextField! @IBOutlet weak var timerPicker: UIDatePicker! + var timersArray: [Timer] = [] + override func viewDidLoad() { @@ -22,6 +24,9 @@ class AddTimerViewController: UIViewController { // Do any additional setup after loading the view. } + func addTimer(timer:Timer){ + timersArray.append(timer) + } func stringFromTimeInterval(interval: CFTimeInterval, withMilliseconds:Bool = true) -> String{ let intInterval = Int(interval) @@ -75,12 +80,16 @@ class AddTimerViewController: UIViewController { @IBAction func addTimer(sender: UIBarButtonItem) { + let timerName = timerNameField.text + + print("\(stringFromTimeInterval(timerPicker.countDownDuration, withMilliseconds: false))") self.navigationController?.popViewControllerAnimated(true) } + /* // MARK: - Navigation diff --git a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard index 0337972..b6ffcf7 100644 --- a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard +++ b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard @@ -197,7 +197,7 @@ - + @@ -244,7 +244,7 @@ - + diff --git a/Timer Demo/Timer Demo/ViewController.swift b/Timer Demo/Timer Demo/ViewController.swift index c9043e0..7d9a6fe 100644 --- a/Timer Demo/Timer Demo/ViewController.swift +++ b/Timer Demo/Timer Demo/ViewController.swift @@ -41,9 +41,6 @@ class ViewController: UIViewController, UITableViewDataSource, UITableViewDelega addTimer(poopTimer) } - func addTimer(timer:Timer){ - timers.append(timer) - } func updateTimer(timer:Timer){ From 1bb6e7c608eaaf04e4579ca7cc59c9d8b52d7bac Mon Sep 17 00:00:00 2001 From: JovannyEspinal Date: Sat, 29 Aug 2015 16:14:58 -0400 Subject: [PATCH 51/79] Fixed Add Timer VC to pass data successfully --- Timer Demo/AddTimerViewController.swift | 46 +++++++++---------- .../Timer Demo/Base.lproj/Main.storyboard | 2 +- Timer Demo/Timer Demo/ViewController.swift | 23 ++++++++-- 3 files changed, 43 insertions(+), 28 deletions(-) diff --git a/Timer Demo/AddTimerViewController.swift b/Timer Demo/AddTimerViewController.swift index a65419f..2b605ce 100644 --- a/Timer Demo/AddTimerViewController.swift +++ b/Timer Demo/AddTimerViewController.swift @@ -8,25 +8,32 @@ import UIKit +protocol AddTimerViewControllerDelegate { + func addTimerViewController(viewController: AddTimerViewController, didCreateNewTimer timer:Timer) +} + class AddTimerViewController: UIViewController { @IBOutlet weak var timerNameField: UITextField! @IBOutlet weak var timerPicker: UIDatePicker! - var timersArray: [Timer] = [] - + var delegate: AddTimerViewControllerDelegate? override func viewDidLoad() { super.viewDidLoad() - // Do any additional setup after loading the view. } - func addTimer(timer:Timer){ - timersArray.append(timer) + @IBAction func saveTimerButtonTapped(sender: AnyObject) { + let newTimer = Timer(timerLabel: timerNameField.text!, startTime: timerPicker.countDownDuration) + delegate?.addTimerViewController(self, didCreateNewTimer: newTimer) + self.navigationController?.popViewControllerAnimated(true) + + } + func stringFromTimeInterval(interval: CFTimeInterval, withMilliseconds:Bool = true) -> String{ let intInterval = Int(interval) @@ -77,28 +84,19 @@ class AddTimerViewController: UIViewController { return timeString } - @IBAction func addTimer(sender: UIBarButtonItem) { - - - let timerName = timerNameField.text - - - - print("\(stringFromTimeInterval(timerPicker.countDownDuration, withMilliseconds: false))") - - self.navigationController?.popViewControllerAnimated(true) - - } +// @IBAction func addTimer(sender: UIBarButtonItem) { +// +// +// +// +// print("\(stringFromTimeInterval(timerPicker.countDownDuration, withMilliseconds: false))") +// +// self.navigationController?.popViewControllerAnimated(true) +// +// } - /* // MARK: - Navigation - // In a storyboard-based application, you will often want to do a little preparation before navigation - override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { - // Get the new view controller using segue.destinationViewController. - // Pass the selected object to the new view controller. - } - */ } diff --git a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard index b6ffcf7..3557b44 100644 --- a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard +++ b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard @@ -246,7 +246,7 @@ - + diff --git a/Timer Demo/Timer Demo/ViewController.swift b/Timer Demo/Timer Demo/ViewController.swift index 7d9a6fe..8ef6282 100644 --- a/Timer Demo/Timer Demo/ViewController.swift +++ b/Timer Demo/Timer Demo/ViewController.swift @@ -10,7 +10,10 @@ import UIKit import QuartzCore import AVFoundation -class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { +class ViewController: UIViewController, + UITableViewDataSource, + UITableViewDelegate, + AddTimerViewControllerDelegate { @IBOutlet weak var tableView: UITableView! @@ -37,8 +40,8 @@ class ViewController: UIViewController, UITableViewDataSource, UITableViewDelega displayLink = CADisplayLink(target: self, selector: Selector("update")) displayLink.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes) - addTimer(popcornTimer) - addTimer(poopTimer) +// addTimer(popcornTimer) +// addTimer(poopTimer) } @@ -64,6 +67,13 @@ class ViewController: UIViewController, UITableViewDataSource, UITableViewDelega } } + + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + if let viewController = segue.destinationViewController as? AddTimerViewController { + viewController.delegate = self + } + } + func displayAlert(){ let alertController = UIAlertController(title: "Time's up!", message: nil, preferredStyle: .Alert) @@ -122,5 +132,12 @@ class ViewController: UIViewController, UITableViewDataSource, UITableViewDelega } } + // MARK: add timer view controller delegate + + func addTimerViewController(viewController: AddTimerViewController, didCreateNewTimer timer: Timer) { + timers.append(timer) + tableView.reloadData() + } + } \ No newline at end of file From fcda3e4d7914af7965e5558b2bc02f22230bc71a Mon Sep 17 00:00:00 2001 From: Derek316x Date: Sat, 29 Aug 2015 16:14:16 -0400 Subject: [PATCH 52/79] n --- Countdown/Countdown/Base.lproj/Main.storyboard | 15 +-------------- Countdown/Countdown/CountdownViewController.swift | 6 +----- 2 files changed, 2 insertions(+), 19 deletions(-) diff --git a/Countdown/Countdown/Base.lproj/Main.storyboard b/Countdown/Countdown/Base.lproj/Main.storyboard index 7e4aebe..5872a96 100644 --- a/Countdown/Countdown/Base.lproj/Main.storyboard +++ b/Countdown/Countdown/Base.lproj/Main.storyboard @@ -16,33 +16,20 @@ - - - - - - - - - - - - - diff --git a/Countdown/Countdown/CountdownViewController.swift b/Countdown/Countdown/CountdownViewController.swift index 4f64179..d54fece 100644 --- a/Countdown/Countdown/CountdownViewController.swift +++ b/Countdown/Countdown/CountdownViewController.swift @@ -13,13 +13,10 @@ class CountdownViewController: UIViewController { @IBOutlet weak var timeToTargetDateLabel: UILabel! @IBOutlet weak var datePicker: UIDatePicker! - - var displayLink : CADisplayLink! + var targetDate = NSDate() override func viewDidLoad() { - displayLink = CADisplayLink(target: self, selector: Selector("updateTimeToTargetDate")) - displayLink.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes) } @IBAction func datePickerValueChanged(sender: UIDatePicker) { @@ -33,7 +30,6 @@ class CountdownViewController: UIViewController { timeToTargetDateLabel.text = timeToTargetDate.stringFromTimeInterval(false) } - /* // MARK: - Navigation From ff648612b98577425df0c1a339f5c095d49c2f0c Mon Sep 17 00:00:00 2001 From: JovannyEspinal Date: Sat, 29 Aug 2015 18:04:32 -0400 Subject: [PATCH 53/79] Fixed Stuff --- Timer Demo/AddTimerViewController.swift | 1 + Timer Demo/Timer Demo/AppDelegate.swift | 2 +- .../AlarmClock.imageset/AlarmClock.png | Bin 0 -> 1468 bytes .../AlarmClock.imageset/Contents.json | 21 +++++++ .../AlarmClockFilled.png | Bin 0 -> 1113 bytes .../AlarmClockFilled.imageset/Contents.json | 21 +++++++ .../Calendar.imageset/Calendar.png | Bin 0 -> 1108 bytes .../Calendar.imageset/Contents.json | 21 +++++++ .../CalendarFilled.png | Bin 0 -> 876 bytes .../CalendarFilled.imageset/Contents.json | 21 +++++++ .../Assets.xcassets/Clock.imageset/Clock.png | Bin 0 -> 1046 bytes .../Clock.imageset/Contents.json | 21 +++++++ .../ClockFilled.imageset/ClockFilled.png | Bin 0 -> 826 bytes .../ClockFilled.imageset/Contents.json | 21 +++++++ .../Timer Demo/Base.lproj/Main.storyboard | 58 ++++++++---------- Timer Demo/Timer Demo/ViewController.swift | 14 +++-- 16 files changed, 162 insertions(+), 39 deletions(-) create mode 100644 Timer Demo/Timer Demo/Assets.xcassets/AlarmClock.imageset/AlarmClock.png create mode 100644 Timer Demo/Timer Demo/Assets.xcassets/AlarmClock.imageset/Contents.json create mode 100644 Timer Demo/Timer Demo/Assets.xcassets/AlarmClockFilled.imageset/AlarmClockFilled.png create mode 100644 Timer Demo/Timer Demo/Assets.xcassets/AlarmClockFilled.imageset/Contents.json create mode 100644 Timer Demo/Timer Demo/Assets.xcassets/Calendar.imageset/Calendar.png create mode 100644 Timer Demo/Timer Demo/Assets.xcassets/Calendar.imageset/Contents.json create mode 100644 Timer Demo/Timer Demo/Assets.xcassets/CalendarFilled.imageset/CalendarFilled.png create mode 100644 Timer Demo/Timer Demo/Assets.xcassets/CalendarFilled.imageset/Contents.json create mode 100644 Timer Demo/Timer Demo/Assets.xcassets/Clock.imageset/Clock.png create mode 100644 Timer Demo/Timer Demo/Assets.xcassets/Clock.imageset/Contents.json create mode 100644 Timer Demo/Timer Demo/Assets.xcassets/ClockFilled.imageset/ClockFilled.png create mode 100644 Timer Demo/Timer Demo/Assets.xcassets/ClockFilled.imageset/Contents.json diff --git a/Timer Demo/AddTimerViewController.swift b/Timer Demo/AddTimerViewController.swift index 2b605ce..93ba6c2 100644 --- a/Timer Demo/AddTimerViewController.swift +++ b/Timer Demo/AddTimerViewController.swift @@ -22,6 +22,7 @@ class AddTimerViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() + timerPicker.countDownDuration = 60 // Do any additional setup after loading the view. } diff --git a/Timer Demo/Timer Demo/AppDelegate.swift b/Timer Demo/Timer Demo/AppDelegate.swift index 840f20d..8c7b0a7 100644 --- a/Timer Demo/Timer Demo/AppDelegate.swift +++ b/Timer Demo/Timer Demo/AppDelegate.swift @@ -12,7 +12,7 @@ import UIKit class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? - + func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // Override point for customization after application launch. diff --git a/Timer Demo/Timer Demo/Assets.xcassets/AlarmClock.imageset/AlarmClock.png b/Timer Demo/Timer Demo/Assets.xcassets/AlarmClock.imageset/AlarmClock.png new file mode 100644 index 0000000000000000000000000000000000000000..f7bfad0775cbfde2475d3540d5395ccb64baea0f GIT binary patch literal 1468 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 QO8@`>07*qoM6N<$f|-2wIsgCw literal 0 HcmV?d00001 diff --git a/Timer Demo/Timer Demo/Assets.xcassets/Clock.imageset/Contents.json b/Timer Demo/Timer Demo/Assets.xcassets/Clock.imageset/Contents.json new file mode 100644 index 0000000..6c1abd2 --- /dev/null +++ b/Timer Demo/Timer Demo/Assets.xcassets/Clock.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Clock.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Timer Demo/Timer Demo/Assets.xcassets/ClockFilled.imageset/ClockFilled.png b/Timer Demo/Timer Demo/Assets.xcassets/ClockFilled.imageset/ClockFilled.png new file mode 100644 index 0000000000000000000000000000000000000000..655976c05d2c0cf6ce9aed4b0f5542ae3bebf0f8 GIT binary patch literal 826 zcmV-A1I7G_P)Px%^hrcPR9FecmrZCBK@`W|Y__HJA_N2>6%?d2O+|VTte4^kR1A1giWe`vSn%dW zktowzL@(ZidaxHSQuHEJ8vLS&UW?E)rFc+mK@bXx)L=I={@<8QHrs8I-DYuM+4tVO z|NFh|cCs^qS{#S&yx40ycE3_;4t~yogP6>c}o78#tvpi7> zk_9%^7N{Iep>^X$@wEni8n}0`jh=W zz?V3NMjrd;0{jij(kBbI&V2OFSzae2=k@_Uhgeg%SJ$GQ7G7PZXy442K#XVOM9CjySybo7c24NcLoqCq~=Wn24GNEXTPCySqLs zRQM@i)diaRG+*paI=rdTM5!n0S(+P`I`CJ zPsbiX)`llHl}pSvJEA_BpN4VS2aMIlUi0CK92qyuP}%lv&^*g3RyG&ktT6w5j#qQ1 z*0Hmcv145TScVC|`a@Jq|F{o-!Oe;BzEEKqM704L9W7hrTtt-j262sb!vM<#)EYpf zAhX}Fb - + @@ -47,7 +47,7 @@ - + @@ -57,7 +57,7 @@ - + @@ -70,10 +70,10 @@ - + - + @@ -85,15 +85,9 @@ - + - - - - - - @@ -102,7 +96,7 @@ - + - - - - - + - - - - - - @@ -271,13 +255,6 @@ - - - - - - - @@ -397,7 +381,7 @@ - + @@ -411,6 +395,12 @@ + + + + + + diff --git a/Timer Demo/Timer Demo/ViewController.swift b/Timer Demo/Timer Demo/ViewController.swift index 8ef6282..b8fe205 100644 --- a/Timer Demo/Timer Demo/ViewController.swift +++ b/Timer Demo/Timer Demo/ViewController.swift @@ -19,8 +19,9 @@ class ViewController: UIViewController, var displayLink : CADisplayLink! var timers: [Timer] = []; - let popcornTimer = Timer.init(timerLabel: "Popcorn", startTime: 4.000) - let poopTimer = Timer.init(timerLabel: "Poop", startTime: 3.000) + let popcornTimer = Timer.init(timerLabel: "Popcorn", startTime: 180.000) + let setRestTimer = Timer.init(timerLabel: "In Between Sets Rest", startTime: 90.000) + let workBreakTimer = Timer.init(timerLabel: "Break", startTime: 60.000*30.000) var audioPlayer = AVAudioPlayer() override func viewDidLoad() { @@ -40,8 +41,10 @@ class ViewController: UIViewController, displayLink = CADisplayLink(target: self, selector: Selector("update")) displayLink.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes) -// addTimer(popcornTimer) -// addTimer(poopTimer) + timers.append(popcornTimer) + timers.append(setRestTimer) + timers.append(workBreakTimer) + } @@ -121,6 +124,9 @@ class ViewController: UIViewController, return timers.count } + + + @IBAction func startPause(startPauseButton: UIButton){ for path in tableView.indexPathsForVisibleRows! { From 89005280e91dbdef6b56e97a5ba6dd10f2a679c0 Mon Sep 17 00:00:00 2001 From: Derek316x Date: Sat, 29 Aug 2015 22:59:49 -0400 Subject: [PATCH 54/79] g --- Countdown/Countdown.xcodeproj/project.pbxproj | 4 ++ .../AddCountdownViewController.swift | 29 ++++++++ .../Base.lproj/LaunchScreen.storyboard | 4 +- .../Countdown/Base.lproj/Main.storyboard | 3 - Timer Demo/AddTimerViewController.swift | 70 +------------------ .../Timer Demo.xcodeproj/project.pbxproj | 14 ++-- .../Timer Demo/Base.lproj/Main.storyboard | 12 ++-- .../Timer Demo/CountdownViewController.swift | 1 - .../Timer Demo/NSTimeIntervalExtension.swift | 60 ++++++++++++++++ Timer Demo/Timer Demo/TableViewCell.swift | 2 - Timer Demo/Timer Demo/Timer.swift | 54 +------------- ...roller.swift => TimerViewController.swift} | 5 +- 12 files changed, 119 insertions(+), 139 deletions(-) create mode 100644 Countdown/Countdown/AddCountdownViewController.swift create mode 100644 Timer Demo/Timer Demo/NSTimeIntervalExtension.swift rename Timer Demo/Timer Demo/{ViewController.swift => TimerViewController.swift} (97%) diff --git a/Countdown/Countdown.xcodeproj/project.pbxproj b/Countdown/Countdown.xcodeproj/project.pbxproj index c311c32..8566a42 100644 --- a/Countdown/Countdown.xcodeproj/project.pbxproj +++ b/Countdown/Countdown.xcodeproj/project.pbxproj @@ -15,6 +15,7 @@ 69E8101F1B91F6B30061915A /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 69E8101D1B91F6B30061915A /* LaunchScreen.storyboard */; }; 69E8102A1B91F6B30061915A /* CountdownTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69E810291B91F6B30061915A /* CountdownTests.swift */; }; 69E810351B91F6B30061915A /* CountdownUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69E810341B91F6B30061915A /* CountdownUITests.swift */; }; + 69EC94271B92548B00FC026D /* AddCountdownViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69EC94261B92548B00FC026D /* AddCountdownViewController.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -49,6 +50,7 @@ 69E810301B91F6B30061915A /* CountdownUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CountdownUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 69E810341B91F6B30061915A /* CountdownUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CountdownUITests.swift; sourceTree = ""; }; 69E810361B91F6B30061915A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 69EC94261B92548B00FC026D /* AddCountdownViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddCountdownViewController.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -102,6 +104,7 @@ 69E810141B91F6B30061915A /* AppDelegate.swift */, 69713F421B923F8E00FCEA28 /* TimeUtilities.swift */, 69713F401B922D2E00FCEA28 /* CountdownViewController.swift */, + 69EC94261B92548B00FC026D /* AddCountdownViewController.swift */, 69E810181B91F6B30061915A /* Main.storyboard */, 69E8101B1B91F6B30061915A /* Assets.xcassets */, 69E8101D1B91F6B30061915A /* LaunchScreen.storyboard */, @@ -258,6 +261,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 69EC94271B92548B00FC026D /* AddCountdownViewController.swift in Sources */, 69713F411B922D2E00FCEA28 /* CountdownViewController.swift in Sources */, 69713F431B923F8E00FCEA28 /* TimeUtilities.swift in Sources */, 69E810151B91F6B30061915A /* AppDelegate.swift in Sources */, diff --git a/Countdown/Countdown/AddCountdownViewController.swift b/Countdown/Countdown/AddCountdownViewController.swift new file mode 100644 index 0000000..939a5d4 --- /dev/null +++ b/Countdown/Countdown/AddCountdownViewController.swift @@ -0,0 +1,29 @@ +// +// AddCountdownViewController.swift +// Countdown +// +// Created by Z on 8/29/15. +// Copyright © 2015 dereknetto. All rights reserved. +// + +import UIKit + +class AddCountdownViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + } + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/Countdown/Countdown/Base.lproj/LaunchScreen.storyboard b/Countdown/Countdown/Base.lproj/LaunchScreen.storyboard index 25e33fa..013d0aa 100644 --- a/Countdown/Countdown/Base.lproj/LaunchScreen.storyboard +++ b/Countdown/Countdown/Base.lproj/LaunchScreen.storyboard @@ -1,7 +1,7 @@ - + - + diff --git a/Countdown/Countdown/Base.lproj/Main.storyboard b/Countdown/Countdown/Base.lproj/Main.storyboard index 5872a96..ae0e9b1 100644 --- a/Countdown/Countdown/Base.lproj/Main.storyboard +++ b/Countdown/Countdown/Base.lproj/Main.storyboard @@ -29,9 +29,6 @@ - - - diff --git a/Timer Demo/AddTimerViewController.swift b/Timer Demo/AddTimerViewController.swift index 93ba6c2..75d8860 100644 --- a/Timer Demo/AddTimerViewController.swift +++ b/Timer Demo/AddTimerViewController.swift @@ -21,83 +21,19 @@ class AddTimerViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() + timerPicker.countDownDuration = 60 // Do any additional setup after loading the view. + } @IBAction func saveTimerButtonTapped(sender: AnyObject) { - let newTimer = Timer(timerLabel: timerNameField.text!, startTime: timerPicker.countDownDuration) + let newTimer = Timer(name: timerNameField.text!, startTime: timerPicker.countDownDuration) delegate?.addTimerViewController(self, didCreateNewTimer: newTimer) self.navigationController?.popViewControllerAnimated(true) - } - - func stringFromTimeInterval(interval: CFTimeInterval, withMilliseconds:Bool = true) -> String{ - let intInterval = Int(interval) - - let years = (intInterval / 31556900) - let months = (intInterval / 2629740) % 12 - let days = (intInterval / (3600 * 24)) % 365 - let hours = (intInterval / 3600) % 24 - let minutes = (intInterval / 60) % 60 - let seconds = intInterval % 60 - let milliseconds = Int(floor(((interval - floor(interval)) * 100))) - - let timeUnits = [years, months, days, hours, minutes, seconds, milliseconds] - - var foundFirstNonzero = false - var timeString = "" - - // remove leading 0s - for (idx, unit) in timeUnits.enumerate() { - if unit == 0 && !foundFirstNonzero { - continue - } - foundFirstNonzero = true - let unitString = unit > 9 ? "\(unit)" : "0\(unit)" - - if (withMilliseconds == true){ - if idx == timeUnits.count - 1 { - timeString = timeString + unitString - } - else if (idx == timeUnits.count - 2){ - timeString = timeString + unitString + "." - }else{ - timeString = timeString + unitString + ":" - } - }else{ - if idx == timeUnits.count - 1 { - //do nothing - } - else if (idx == timeUnits.count - 2){ - timeString = timeString + unitString - }else{ - timeString = timeString + unitString + ":" - } - } - - } - - return timeString - } - -// @IBAction func addTimer(sender: UIBarButtonItem) { -// -// -// -// -// print("\(stringFromTimeInterval(timerPicker.countDownDuration, withMilliseconds: false))") -// -// self.navigationController?.popViewControllerAnimated(true) -// -// } - - - // MARK: - Navigation - - } diff --git a/Timer Demo/Timer Demo.xcodeproj/project.pbxproj b/Timer Demo/Timer Demo.xcodeproj/project.pbxproj index bda160b..9f9aa69 100644 --- a/Timer Demo/Timer Demo.xcodeproj/project.pbxproj +++ b/Timer Demo/Timer Demo.xcodeproj/project.pbxproj @@ -13,7 +13,7 @@ 504DC2311B922AB60071A35E /* LoudAlarmClockBuzzer.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = 504DC2301B922AB60071A35E /* LoudAlarmClockBuzzer.mp3 */; }; 504DC2331B922CF30071A35E /* AddTimerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504DC2321B922CF30071A35E /* AddTimerViewController.swift */; }; 6981737C1B88EFF0000D38F2 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6981737B1B88EFF0000D38F2 /* AppDelegate.swift */; }; - 6981737E1B88EFF0000D38F2 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6981737D1B88EFF0000D38F2 /* ViewController.swift */; }; + 6981737E1B88EFF0000D38F2 /* TimerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6981737D1B88EFF0000D38F2 /* TimerViewController.swift */; }; 698173811B88EFF0000D38F2 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6981737F1B88EFF0000D38F2 /* Main.storyboard */; }; 698173831B88EFF0000D38F2 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 698173821B88EFF0000D38F2 /* Assets.xcassets */; }; 698173861B88EFF0000D38F2 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 698173841B88EFF0000D38F2 /* LaunchScreen.storyboard */; }; @@ -21,6 +21,7 @@ 6981739C1B88EFF0000D38F2 /* Timer_DemoUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6981739B1B88EFF0000D38F2 /* Timer_DemoUITests.swift */; }; 698173AA1B88F28C000D38F2 /* Timer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 698173A91B88F28C000D38F2 /* Timer.swift */; }; 69E810431B91FD170061915A /* CountdownViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69E810421B91FD170061915A /* CountdownViewController.swift */; }; + 69EC94251B924F8600FC026D /* NSTimeIntervalExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69EC94241B924F8600FC026D /* NSTimeIntervalExtension.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -48,7 +49,7 @@ 504DC2321B922CF30071A35E /* AddTimerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AddTimerViewController.swift; path = ../AddTimerViewController.swift; sourceTree = ""; }; 698173781B88EFF0000D38F2 /* Timer Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Timer Demo.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 6981737B1B88EFF0000D38F2 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 6981737D1B88EFF0000D38F2 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 6981737D1B88EFF0000D38F2 /* TimerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimerViewController.swift; sourceTree = ""; }; 698173801B88EFF0000D38F2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 698173821B88EFF0000D38F2 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 698173851B88EFF0000D38F2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; @@ -61,6 +62,7 @@ 6981739D1B88EFF0000D38F2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 698173A91B88F28C000D38F2 /* Timer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Timer.swift; sourceTree = ""; }; 69E810421B91FD170061915A /* CountdownViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CountdownViewController.swift; sourceTree = ""; }; + 69EC94241B924F8600FC026D /* NSTimeIntervalExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSTimeIntervalExtension.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -114,12 +116,13 @@ isa = PBXGroup; children = ( 6981737B1B88EFF0000D38F2 /* AppDelegate.swift */, + 69EC94241B924F8600FC026D /* NSTimeIntervalExtension.swift */, 698173A91B88F28C000D38F2 /* Timer.swift */, 5016E10B1B89209300C5EFFD /* TableViewCell.swift */, - 6981737D1B88EFF0000D38F2 /* ViewController.swift */, + 6981737D1B88EFF0000D38F2 /* TimerViewController.swift */, + 504DC2321B922CF30071A35E /* AddTimerViewController.swift */, 504DC2281B8FE3E30071A35E /* StopwatchViewController.swift */, 69E810421B91FD170061915A /* CountdownViewController.swift */, - 504DC2321B922CF30071A35E /* AddTimerViewController.swift */, 504DC2301B922AB60071A35E /* LoudAlarmClockBuzzer.mp3 */, 6981737F1B88EFF0000D38F2 /* Main.storyboard */, 698173821B88EFF0000D38F2 /* Assets.xcassets */, @@ -280,9 +283,10 @@ files = ( 69E810431B91FD170061915A /* CountdownViewController.swift in Sources */, 698173AA1B88F28C000D38F2 /* Timer.swift in Sources */, + 69EC94251B924F8600FC026D /* NSTimeIntervalExtension.swift in Sources */, 5016E10C1B89209300C5EFFD /* TableViewCell.swift in Sources */, 504DC2291B8FE3E30071A35E /* StopwatchViewController.swift in Sources */, - 6981737E1B88EFF0000D38F2 /* ViewController.swift in Sources */, + 6981737E1B88EFF0000D38F2 /* TimerViewController.swift in Sources */, 6981737C1B88EFF0000D38F2 /* AppDelegate.swift in Sources */, 504DC2331B922CF30071A35E /* AddTimerViewController.swift in Sources */, ); diff --git a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard index 97c0114..98273a0 100644 --- a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard +++ b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard @@ -1,7 +1,7 @@ - + - + @@ -41,7 +41,7 @@ @@ -51,7 +51,7 @@ - + @@ -264,11 +264,11 @@ - + - + diff --git a/Timer Demo/Timer Demo/CountdownViewController.swift b/Timer Demo/Timer Demo/CountdownViewController.swift index 4373046..0bb6b56 100644 --- a/Timer Demo/Timer Demo/CountdownViewController.swift +++ b/Timer Demo/Timer Demo/CountdownViewController.swift @@ -12,7 +12,6 @@ class CountdownViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - } /* diff --git a/Timer Demo/Timer Demo/NSTimeIntervalExtension.swift b/Timer Demo/Timer Demo/NSTimeIntervalExtension.swift new file mode 100644 index 0000000..aea7c29 --- /dev/null +++ b/Timer Demo/Timer Demo/NSTimeIntervalExtension.swift @@ -0,0 +1,60 @@ +// +// TimeUtilities.swift +// Countdown +// +// Created by Z on 8/29/15. +// Copyright © 2015 dereknetto. All rights reserved. +// + +import UIKit + +extension NSTimeInterval{ + + func stringFromTimeInterval(withMilliseconds:Bool) -> String{ + + let years = (self / 31556900) + let months = (self / 2629740) % 12 + let days = (self / (3600 * 24)) % 365 + let hours = (self / 3600) % 24 + let minutes = (self / 60) % 60 + let seconds = self % 60 + let milliseconds = Double(Int(floor(((self - floor(self)) * 100)))) + + let timeUnits: [NSTimeInterval] = [years, months, days, hours, minutes, seconds, milliseconds] + + var foundFirstNonzero = false + var timeString = "" + + // remove leading 0s + for (idx, unit) in timeUnits.enumerate() { + if unit == 0 && !foundFirstNonzero { + continue + } + foundFirstNonzero = true + let unitString = unit > 9 ? "\(unit)" : "0\(unit)" + + if (withMilliseconds == true){ + if idx == timeUnits.count - 1 { + timeString = timeString + unitString + } + else if (idx == timeUnits.count - 2){ + timeString = timeString + unitString + "." + }else{ + timeString = timeString + unitString + ":" + } + }else{ + if idx == timeUnits.count - 1 { + //do nothing + } + else if (idx == timeUnits.count - 2){ + timeString = timeString + unitString + }else{ + timeString = timeString + unitString + ":" + } + } + } + + return timeString + } + +} \ No newline at end of file diff --git a/Timer Demo/Timer Demo/TableViewCell.swift b/Timer Demo/Timer Demo/TableViewCell.swift index 7dd07bc..ff1fa5b 100644 --- a/Timer Demo/Timer Demo/TableViewCell.swift +++ b/Timer Demo/Timer Demo/TableViewCell.swift @@ -15,7 +15,6 @@ class TableViewCell: UITableViewCell { @IBOutlet weak var startPauseButton: UIButton! @IBOutlet weak var progressBar: UIProgressView! - var timer : Timer! var maxWidth : CGFloat = 0.0 @@ -25,7 +24,6 @@ class TableViewCell: UITableViewCell { override func setSelected(selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) - // Configure the view for the selected state } diff --git a/Timer Demo/Timer Demo/Timer.swift b/Timer Demo/Timer Demo/Timer.swift index 6eedfc8..0407dd8 100644 --- a/Timer Demo/Timer Demo/Timer.swift +++ b/Timer Demo/Timer Demo/Timer.swift @@ -15,60 +15,10 @@ class Timer: NSObject { var remainingTime: CFTimeInterval! var isPaused = true - - init(timerLabel: String, startTime:CFTimeInterval){ + init(name: String, startTime:CFTimeInterval){ self.startTime = startTime self.remainingTime = startTime - self.timerName = timerLabel - } - - func stringFromTimeInterval(interval: CFTimeInterval, withMilliseconds:Bool = true) -> String{ - let intInterval = Int(interval) - - let years = (intInterval / 31556900) - let months = (intInterval / 2629740) % 12 - let days = (intInterval / (3600 * 24)) % 365 - let hours = (intInterval / 3600) % 24 - let minutes = (intInterval / 60) % 60 - let seconds = intInterval % 60 - let milliseconds = Int(floor(((interval - floor(interval)) * 100))) - - let timeUnits = [years, months, days, hours, minutes, seconds, milliseconds] - - var foundFirstNonzero = false - var timeString = "" - - // remove leading 0s - for (idx, unit) in timeUnits.enumerate() { - if unit == 0 && !foundFirstNonzero { - continue - } - foundFirstNonzero = true - let unitString = unit > 9 ? "\(unit)" : "0\(unit)" - - if (withMilliseconds == true){ - if idx == timeUnits.count - 1 { - timeString = timeString + unitString - } - else if (idx == timeUnits.count - 2){ - timeString = timeString + unitString + "." - }else{ - timeString = timeString + unitString + ":" - } - }else{ - if idx == timeUnits.count - 1 { - //do nothing - } - else if (idx == timeUnits.count - 2){ - timeString = timeString + unitString - }else{ - timeString = timeString + unitString + ":" - } - } - - } - - return timeString + self.timerName = name } } diff --git a/Timer Demo/Timer Demo/ViewController.swift b/Timer Demo/Timer Demo/TimerViewController.swift similarity index 97% rename from Timer Demo/Timer Demo/ViewController.swift rename to Timer Demo/Timer Demo/TimerViewController.swift index b8fe205..e0f70a2 100644 --- a/Timer Demo/Timer Demo/ViewController.swift +++ b/Timer Demo/Timer Demo/TimerViewController.swift @@ -19,9 +19,11 @@ class ViewController: UIViewController, var displayLink : CADisplayLink! var timers: [Timer] = []; + let popcornTimer = Timer.init(timerLabel: "Popcorn", startTime: 180.000) let setRestTimer = Timer.init(timerLabel: "In Between Sets Rest", startTime: 90.000) let workBreakTimer = Timer.init(timerLabel: "Break", startTime: 60.000*30.000) + var audioPlayer = AVAudioPlayer() override func viewDidLoad() { @@ -45,6 +47,7 @@ class ViewController: UIViewController, timers.append(setRestTimer) timers.append(workBreakTimer) + } @@ -98,7 +101,7 @@ class ViewController: UIViewController, cell.timer = timer cell.timerName.text = cell.timer.timerName - cell.timerLabel.text = String(cell.timer.stringFromTimeInterval(cell.timer.remainingTime)) + cell.timerLabel.text = cell.timer.remainingTime.stringFromTimeInterval(false) if timer.isPaused { From 426551fe7952ec6f161073e7e64e04debf6b774b Mon Sep 17 00:00:00 2001 From: Derek316x Date: Sat, 29 Aug 2015 22:57:22 -0400 Subject: [PATCH 55/79] countdown done --- .../AddCountdownViewController.swift | 47 +++- .../Countdown/Base.lproj/Main.storyboard | 201 +++++++++++++++++- .../Countdown/CountdownViewController.swift | 46 ++-- Countdown/Countdown/TimeUtilities.swift | 17 +- MyPlayground.playground/Contents.swift | 60 ++++++ .../Base.lproj/Main.storyboard | 2 +- 6 files changed, 330 insertions(+), 43 deletions(-) diff --git a/Countdown/Countdown/AddCountdownViewController.swift b/Countdown/Countdown/AddCountdownViewController.swift index 939a5d4..051dac8 100644 --- a/Countdown/Countdown/AddCountdownViewController.swift +++ b/Countdown/Countdown/AddCountdownViewController.swift @@ -8,22 +8,49 @@ import UIKit +protocol AddCountdownViewControllerDelegate { + func addCountdownViewController(viewController: AddCountdownViewController, didCreateNewCountdown targetDate:NSDate) +} + class AddCountdownViewController: UIViewController { + + var delegate: AddCountdownViewControllerDelegate? + + @IBOutlet weak var datePicker: UIDatePicker! + @IBOutlet weak var targetDateLabel: UILabel! + @IBOutlet weak var targetTimeLabel: UILabel! + @IBOutlet weak var timerNameTextField: UITextField! + @IBOutlet weak var setCountdownButton: UIButton! override func viewDidLoad() { super.viewDidLoad() - - // Do any additional setup after loading the view. + updateDateAndTimeLabel() } - /* - // MARK: - Navigation - - // In a storyboard-based application, you will often want to do a little preparation before navigation - override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { - // Get the new view controller using segue.destinationViewController. - // Pass the selected object to the new view controller. + func updateDateAndTimeLabel(){ + let dateAndTime = dateAndTimeStringsfromDate(datePicker.date) + targetDateLabel.text = (dateAndTime as NSArray).objectAtIndex(0) as? String + targetTimeLabel.text = (dateAndTime as NSArray).objectAtIndex(1)as? String + } + + @IBAction func datePickerValueChanged(sender: UIDatePicker) { + updateDateAndTimeLabel() + } + + @IBAction func setCountdownButtonTapped(sender: UIButton) { + if datePicker.date.timeIntervalSinceNow > 0 { //makes sure that target date is in the future + let newTargetDate = datePicker.date + delegate?.addCountdownViewController(self, didCreateNewCountdown: newTargetDate) + self.dismissViewControllerAnimated(false, completion: nil) + } + } + + func dateAndTimeStringsfromDate(date:NSDate) -> ([String]){ + let formatter = NSDateFormatter() + formatter.dateStyle = .LongStyle + formatter.timeStyle = .MediumStyle + let fullString = formatter.stringFromDate(datePicker.date) + return (fullString.componentsSeparatedByString(" at ")) } - */ } diff --git a/Countdown/Countdown/Base.lproj/Main.storyboard b/Countdown/Countdown/Base.lproj/Main.storyboard index ae0e9b1..07fefe9 100644 --- a/Countdown/Countdown/Base.lproj/Main.storyboard +++ b/Countdown/Countdown/Base.lproj/Main.storyboard @@ -2,6 +2,7 @@ + @@ -17,22 +18,220 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Countdown/Countdown/CountdownViewController.swift b/Countdown/Countdown/CountdownViewController.swift index d54fece..06af361 100644 --- a/Countdown/Countdown/CountdownViewController.swift +++ b/Countdown/Countdown/CountdownViewController.swift @@ -8,36 +8,36 @@ import UIKit -class CountdownViewController: UIViewController { +class CountdownViewController: UIViewController, AddCountdownViewControllerDelegate { - @IBOutlet weak var timeToTargetDateLabel: UILabel! - @IBOutlet weak var datePicker: UIDatePicker! - - var targetDate = NSDate() - + var targetDate : NSDate? + var displayLink : CADisplayLink! + override func viewDidLoad() { - } - - @IBAction func datePickerValueChanged(sender: UIDatePicker) { - targetDate = datePicker.date - updateTimeToTargetDate() + super.viewDidLoad() + displayLink = CADisplayLink(target: self, selector: Selector("updateTimeToTargetDate")) + displayLink.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes) } func updateTimeToTargetDate(){ - let currentDate = NSDate() - let timeToTargetDate = targetDate.timeIntervalSinceDate(currentDate) - timeToTargetDateLabel.text = timeToTargetDate.stringFromTimeInterval(false) + if let setTargetDate = targetDate{ + let currentDate = NSDate() + let timeToTargetDate = setTargetDate.timeIntervalSinceDate(currentDate) + timeToTargetDateLabel.text = timeToTargetDate.stringFromTimeInterval(false) + } } - - /* - // MARK: - Navigation - - // In a storyboard-based application, you will often want to do a little preparation before navigation + + //MARK: AddCountdownViewControllerDelegate method + func addCountdownViewController(viewController: AddCountdownViewController, didCreateNewCountdown targetDate: NSDate) { + self.targetDate = targetDate + } + + //MARK: Segue methods override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { - // Get the new view controller using segue.destinationViewController. - // Pass the selected object to the new view controller. + if let viewController = segue.destinationViewController as? AddCountdownViewController { + viewController.delegate = self + } } - */ - + } diff --git a/Countdown/Countdown/TimeUtilities.swift b/Countdown/Countdown/TimeUtilities.swift index 6448745..deff165 100644 --- a/Countdown/Countdown/TimeUtilities.swift +++ b/Countdown/Countdown/TimeUtilities.swift @@ -11,16 +11,17 @@ import UIKit extension NSTimeInterval{ func stringFromTimeInterval(withMilliseconds:Bool) -> String{ + let intInterval = Int(self) - let years = (self / 31556900) - let months = (self / 2629740) % 12 - let days = (self / (3600 * 24)) % 365 - let hours = (self / 3600) % 24 - let minutes = (self / 60) % 60 - let seconds = self % 60 - let milliseconds = Double(Int(floor(((self - floor(self)) * 100)))) + let years = (intInterval / 31556900) + let months = (intInterval / 2629740) % 12 + let days = (intInterval / (3600 * 24)) % 365 + let hours = (intInterval / 3600) % 24 + let minutes = (intInterval / 60) % 60 + let seconds = intInterval % 60 + let milliseconds = Int(floor(((self - floor(self)) * 100))) - let timeUnits: [NSTimeInterval] = [years, months, days, hours, minutes, seconds, milliseconds] + let timeUnits = [years, months, days, hours, minutes, seconds, milliseconds] var foundFirstNonzero = false var timeString = "" diff --git a/MyPlayground.playground/Contents.swift b/MyPlayground.playground/Contents.swift index 2c24b6c..42e837b 100644 --- a/MyPlayground.playground/Contents.swift +++ b/MyPlayground.playground/Contents.swift @@ -10,3 +10,63 @@ var b:Int = 365 let q = b/a +extension NSTimeInterval{ + + func stringFromTimeInterval(withMilliseconds:Bool) -> String{ + + let years = (self / 31556900) + let months = (self / 2629740) % 12 + let days = (self / (3600 * 24)) % 365 + let hours = (self / 3600) % 24 + let minutes = (self / 60) % 60 + let seconds = self % 60 + let milliseconds = floor(((self - floor(self)) * 100)) + + let timeUnits = [years, months, days, hours, minutes, seconds, milliseconds] + + var foundFirstNonzero = false + var timeString = "" + + // remove leading 0s + for (idx, unit) in timeUnits.enumerate() { + if unit == 0 && !foundFirstNonzero { + continue + } + foundFirstNonzero = true + let unitString = unit > 9 ? "\(unit)" : "0\(unit)" + + if (withMilliseconds == true){ + if idx == timeUnits.count - 1 { + timeString = timeString + unitString + } + else if (idx == timeUnits.count - 2){ + timeString = timeString + unitString + "." + }else{ + timeString = timeString + unitString + ":" + } + }else{ + if idx == timeUnits.count - 1 { + //do nothing + } + else if (idx == timeUnits.count - 2){ + timeString = timeString + unitString + }else{ + timeString = timeString + unitString + ":" + } + } + } + + return timeString + } + +} + +let NS + + + + + + + + diff --git a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/Base.lproj/Main.storyboard b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/Base.lproj/Main.storyboard index 7e13c69..50a30a4 100644 --- a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/Base.lproj/Main.storyboard +++ b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/Base.lproj/Main.storyboard @@ -34,7 +34,7 @@ From c89a9dd507747948efd3df1c4a7cca09521c8e6e Mon Sep 17 00:00:00 2001 From: Derek316x Date: Sat, 29 Aug 2015 23:46:37 -0400 Subject: [PATCH 56/79] all 3 in tab bar controller --- .../Countdown/Base.lproj/Main.storyboard | 4 +- Timer Demo/AddTimerViewController.swift | 3 - .../Timer Demo.xcodeproj/project.pbxproj | 20 +- .../AddCountdownViewController.swift | 56 ++++ .../Timer Demo/Base.lproj/Main.storyboard | 280 +++++++++++++++--- .../Timer Demo/CountdownViewController.swift | 42 ++- .../Timer Demo/StopwatchViewController.swift | 7 +- ...valExtension.swift => TimeUtilities.swift} | 19 +- .../Timer Demo/TimerViewController.swift | 17 +- 9 files changed, 362 insertions(+), 86 deletions(-) create mode 100644 Timer Demo/Timer Demo/AddCountdownViewController.swift rename Timer Demo/Timer Demo/{NSTimeIntervalExtension.swift => TimeUtilities.swift} (75%) diff --git a/Countdown/Countdown/Base.lproj/Main.storyboard b/Countdown/Countdown/Base.lproj/Main.storyboard index 07fefe9..68dfa7d 100644 --- a/Countdown/Countdown/Base.lproj/Main.storyboard +++ b/Countdown/Countdown/Base.lproj/Main.storyboard @@ -54,7 +54,7 @@ - + @@ -231,7 +231,7 @@ - + diff --git a/Timer Demo/AddTimerViewController.swift b/Timer Demo/AddTimerViewController.swift index 75d8860..004ea02 100644 --- a/Timer Demo/AddTimerViewController.swift +++ b/Timer Demo/AddTimerViewController.swift @@ -22,18 +22,15 @@ class AddTimerViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - timerPicker.countDownDuration = 60 // Do any additional setup after loading the view. - } @IBAction func saveTimerButtonTapped(sender: AnyObject) { let newTimer = Timer(name: timerNameField.text!, startTime: timerPicker.countDownDuration) delegate?.addTimerViewController(self, didCreateNewTimer: newTimer) self.navigationController?.popViewControllerAnimated(true) - } } diff --git a/Timer Demo/Timer Demo.xcodeproj/project.pbxproj b/Timer Demo/Timer Demo.xcodeproj/project.pbxproj index 9f9aa69..ac527aa 100644 --- a/Timer Demo/Timer Demo.xcodeproj/project.pbxproj +++ b/Timer Demo/Timer Demo.xcodeproj/project.pbxproj @@ -20,8 +20,9 @@ 698173911B88EFF0000D38F2 /* Timer_DemoTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 698173901B88EFF0000D38F2 /* Timer_DemoTests.swift */; }; 6981739C1B88EFF0000D38F2 /* Timer_DemoUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6981739B1B88EFF0000D38F2 /* Timer_DemoUITests.swift */; }; 698173AA1B88F28C000D38F2 /* Timer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 698173A91B88F28C000D38F2 /* Timer.swift */; }; - 69E810431B91FD170061915A /* CountdownViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69E810421B91FD170061915A /* CountdownViewController.swift */; }; - 69EC94251B924F8600FC026D /* NSTimeIntervalExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69EC94241B924F8600FC026D /* NSTimeIntervalExtension.swift */; }; + 69B738381B92B07B00390657 /* CountdownViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69B738361B92B07B00390657 /* CountdownViewController.swift */; }; + 69B738391B92B07B00390657 /* AddCountdownViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69B738371B92B07B00390657 /* AddCountdownViewController.swift */; }; + 69F51D721B92AA4D004F3874 /* TimeUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69F51D711B92AA4D004F3874 /* TimeUtilities.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -61,8 +62,9 @@ 6981739B1B88EFF0000D38F2 /* Timer_DemoUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Timer_DemoUITests.swift; sourceTree = ""; }; 6981739D1B88EFF0000D38F2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 698173A91B88F28C000D38F2 /* Timer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Timer.swift; sourceTree = ""; }; - 69E810421B91FD170061915A /* CountdownViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CountdownViewController.swift; sourceTree = ""; }; - 69EC94241B924F8600FC026D /* NSTimeIntervalExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSTimeIntervalExtension.swift; sourceTree = ""; }; + 69B738361B92B07B00390657 /* CountdownViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CountdownViewController.swift; sourceTree = ""; }; + 69B738371B92B07B00390657 /* AddCountdownViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddCountdownViewController.swift; sourceTree = ""; }; + 69F51D711B92AA4D004F3874 /* TimeUtilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TimeUtilities.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -116,13 +118,14 @@ isa = PBXGroup; children = ( 6981737B1B88EFF0000D38F2 /* AppDelegate.swift */, - 69EC94241B924F8600FC026D /* NSTimeIntervalExtension.swift */, + 69F51D711B92AA4D004F3874 /* TimeUtilities.swift */, 698173A91B88F28C000D38F2 /* Timer.swift */, 5016E10B1B89209300C5EFFD /* TableViewCell.swift */, 6981737D1B88EFF0000D38F2 /* TimerViewController.swift */, 504DC2321B922CF30071A35E /* AddTimerViewController.swift */, 504DC2281B8FE3E30071A35E /* StopwatchViewController.swift */, - 69E810421B91FD170061915A /* CountdownViewController.swift */, + 69B738361B92B07B00390657 /* CountdownViewController.swift */, + 69B738371B92B07B00390657 /* AddCountdownViewController.swift */, 504DC2301B922AB60071A35E /* LoudAlarmClockBuzzer.mp3 */, 6981737F1B88EFF0000D38F2 /* Main.storyboard */, 698173821B88EFF0000D38F2 /* Assets.xcassets */, @@ -281,11 +284,12 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 69E810431B91FD170061915A /* CountdownViewController.swift in Sources */, + 69B738381B92B07B00390657 /* CountdownViewController.swift in Sources */, + 69F51D721B92AA4D004F3874 /* TimeUtilities.swift in Sources */, 698173AA1B88F28C000D38F2 /* Timer.swift in Sources */, - 69EC94251B924F8600FC026D /* NSTimeIntervalExtension.swift in Sources */, 5016E10C1B89209300C5EFFD /* TableViewCell.swift in Sources */, 504DC2291B8FE3E30071A35E /* StopwatchViewController.swift in Sources */, + 69B738391B92B07B00390657 /* AddCountdownViewController.swift in Sources */, 6981737E1B88EFF0000D38F2 /* TimerViewController.swift in Sources */, 6981737C1B88EFF0000D38F2 /* AppDelegate.swift in Sources */, 504DC2331B922CF30071A35E /* AddTimerViewController.swift in Sources */, diff --git a/Timer Demo/Timer Demo/AddCountdownViewController.swift b/Timer Demo/Timer Demo/AddCountdownViewController.swift new file mode 100644 index 0000000..a5c9d42 --- /dev/null +++ b/Timer Demo/Timer Demo/AddCountdownViewController.swift @@ -0,0 +1,56 @@ +// +// AddCountdownViewController.swift +// Countdown +// +// Created by Z on 8/29/15. +// Copyright © 2015 dereknetto. All rights reserved. +// + +import UIKit + +protocol AddCountdownViewControllerDelegate { + func addCountdownViewController(viewController: AddCountdownViewController, didCreateNewCountdown targetDate:NSDate, name:String) +} + +class AddCountdownViewController: UIViewController { + + var delegate: AddCountdownViewControllerDelegate? + + @IBOutlet weak var datePicker: UIDatePicker! + @IBOutlet weak var targetDateLabel: UILabel! + @IBOutlet weak var targetTimeLabel: UILabel! + @IBOutlet weak var timerNameTextField: UITextField! + @IBOutlet weak var setCountdownButton: UIButton! + + override func viewDidLoad() { + super.viewDidLoad() + updateDateAndTimeLabel() + } + + func updateDateAndTimeLabel(){ + let dateAndTime = dateAndTimeStringsfromDate(datePicker.date) + targetDateLabel.text = (dateAndTime as NSArray).objectAtIndex(0) as? String + targetTimeLabel.text = (dateAndTime as NSArray).objectAtIndex(1)as? String + } + + @IBAction func datePickerValueChanged(sender: UIDatePicker) { + updateDateAndTimeLabel() + } + + @IBAction func setCountdownButtonTapped(sender: UIButton) { + if datePicker.date.timeIntervalSinceNow > 0 { //makes sure that target date is in the future + let newTargetDate = datePicker.date + delegate?.addCountdownViewController(self, didCreateNewCountdown: newTargetDate, name:timerNameTextField.text!) + self.dismissViewControllerAnimated(false, completion: nil) + } + } + + func dateAndTimeStringsfromDate(date:NSDate) -> ([String]){ + let formatter = NSDateFormatter() + formatter.dateStyle = .LongStyle + formatter.timeStyle = .MediumStyle + let fullString = formatter.stringFromDate(datePicker.date) + return (fullString.componentsSeparatedByString(" at ")) + } + +} diff --git a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard index 98273a0..4fbdc7d 100644 --- a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard +++ b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard @@ -19,39 +19,12 @@ - + - - - - - - - - - - - - - - - - - - - - - - - + @@ -68,7 +41,7 @@ - + @@ -96,7 +69,7 @@ - + @@ -241,7 +214,7 @@ - + @@ -391,14 +364,249 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - diff --git a/Timer Demo/Timer Demo/CountdownViewController.swift b/Timer Demo/Timer Demo/CountdownViewController.swift index 0bb6b56..3b8df8a 100644 --- a/Timer Demo/Timer Demo/CountdownViewController.swift +++ b/Timer Demo/Timer Demo/CountdownViewController.swift @@ -1,6 +1,6 @@ // // CountdownViewController.swift -// Timer Demo +// Countdown // // Created by Z on 8/29/15. // Copyright © 2015 dereknetto. All rights reserved. @@ -8,20 +8,38 @@ import UIKit -class CountdownViewController: UIViewController { - +class CountdownViewController: UIViewController, AddCountdownViewControllerDelegate { + + @IBOutlet weak var timeToTargetDateLabel: UILabel! + @IBOutlet weak var navigationBar: UINavigationItem! + var targetDate : NSDate? + var displayLink : CADisplayLink! + override func viewDidLoad() { super.viewDidLoad() + displayLink = CADisplayLink(target: self, selector: Selector("updateTimeToTargetDate")) + displayLink.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes) } - - /* - // MARK: - Navigation - - // In a storyboard-based application, you will often want to do a little preparation before navigation + + func updateTimeToTargetDate(){ + if let setTargetDate = targetDate{ + let currentDate = NSDate() + let timeToTargetDate = setTargetDate.timeIntervalSinceDate(currentDate) + timeToTargetDateLabel.text = timeToTargetDate.stringFromTimeInterval(false) + } + } + + //MARK: AddCountdownViewControllerDelegate method + func addCountdownViewController(viewController: AddCountdownViewController, didCreateNewCountdown targetDate: NSDate, name: String) { + self.targetDate = targetDate + navigationBar.prompt = name + } + + //MARK: Segue methods override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { - // Get the new view controller using segue.destinationViewController. - // Pass the selected object to the new view controller. + if let viewController = segue.destinationViewController as? AddCountdownViewController { + viewController.delegate = self + } } - */ - + } diff --git a/Timer Demo/Timer Demo/StopwatchViewController.swift b/Timer Demo/Timer Demo/StopwatchViewController.swift index 7ab5568..b9e3497 100644 --- a/Timer Demo/Timer Demo/StopwatchViewController.swift +++ b/Timer Demo/Timer Demo/StopwatchViewController.swift @@ -134,18 +134,17 @@ class StopwatchViewController: UIViewController { //MARK: Update methods func updateStopwatch() { totalTime += timer.duration - stopwatchString = stringFromTimeInterval(totalTime) - + stopwatchString = stopwatchStringFromTimeInterval(totalTime) stopwatchLabel.text = stopwatchString } func updateLap(){ lapElapsedTime += lapTimer.duration - lapString = stringFromTimeInterval(lapElapsedTime) + lapString = stopwatchStringFromTimeInterval(lapElapsedTime) } - func stringFromTimeInterval(interval: CFTimeInterval) -> String { + func stopwatchStringFromTimeInterval(interval: CFTimeInterval) -> String { let intInterval = Int(interval) let minutes = (intInterval / 60) % 60 let seconds = intInterval % 60 diff --git a/Timer Demo/Timer Demo/NSTimeIntervalExtension.swift b/Timer Demo/Timer Demo/TimeUtilities.swift similarity index 75% rename from Timer Demo/Timer Demo/NSTimeIntervalExtension.swift rename to Timer Demo/Timer Demo/TimeUtilities.swift index aea7c29..deff165 100644 --- a/Timer Demo/Timer Demo/NSTimeIntervalExtension.swift +++ b/Timer Demo/Timer Demo/TimeUtilities.swift @@ -11,16 +11,17 @@ import UIKit extension NSTimeInterval{ func stringFromTimeInterval(withMilliseconds:Bool) -> String{ + let intInterval = Int(self) - let years = (self / 31556900) - let months = (self / 2629740) % 12 - let days = (self / (3600 * 24)) % 365 - let hours = (self / 3600) % 24 - let minutes = (self / 60) % 60 - let seconds = self % 60 - let milliseconds = Double(Int(floor(((self - floor(self)) * 100)))) + let years = (intInterval / 31556900) + let months = (intInterval / 2629740) % 12 + let days = (intInterval / (3600 * 24)) % 365 + let hours = (intInterval / 3600) % 24 + let minutes = (intInterval / 60) % 60 + let seconds = intInterval % 60 + let milliseconds = Int(floor(((self - floor(self)) * 100))) - let timeUnits: [NSTimeInterval] = [years, months, days, hours, minutes, seconds, milliseconds] + let timeUnits = [years, months, days, hours, minutes, seconds, milliseconds] var foundFirstNonzero = false var timeString = "" @@ -57,4 +58,4 @@ extension NSTimeInterval{ return timeString } -} \ No newline at end of file +} diff --git a/Timer Demo/Timer Demo/TimerViewController.swift b/Timer Demo/Timer Demo/TimerViewController.swift index e0f70a2..afdb6a4 100644 --- a/Timer Demo/Timer Demo/TimerViewController.swift +++ b/Timer Demo/Timer Demo/TimerViewController.swift @@ -18,19 +18,18 @@ class ViewController: UIViewController, @IBOutlet weak var tableView: UITableView! var displayLink : CADisplayLink! + var audioPlayer = AVAudioPlayer() var timers: [Timer] = []; - let popcornTimer = Timer.init(timerLabel: "Popcorn", startTime: 180.000) - let setRestTimer = Timer.init(timerLabel: "In Between Sets Rest", startTime: 90.000) - let workBreakTimer = Timer.init(timerLabel: "Break", startTime: 60.000*30.000) - - var audioPlayer = AVAudioPlayer() + //default timers + let popcornTimer = Timer(name: "Popcorn", startTime: 180.000) + let setRestTimer = Timer(name: "In Between Sets Rest", startTime: 90.000) + let workBreakTimer = Timer(name: "Break", startTime: 60.000*30.000) override func viewDidLoad() { super.viewDidLoad() let alertSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("LoudAlarmClockBuzzer", ofType: "mp3")!) - do { try audioPlayer = AVAudioPlayer(contentsOfURL: alertSound) } catch { @@ -46,13 +45,10 @@ class ViewController: UIViewController, timers.append(popcornTimer) timers.append(setRestTimer) timers.append(workBreakTimer) - - } func updateTimer(timer:Timer){ - timer.remainingTime = timer.remainingTime - displayLink.duration print("Remaining time: \(timer.remainingTime)") } @@ -127,9 +123,6 @@ class ViewController: UIViewController, return timers.count } - - - @IBAction func startPause(startPauseButton: UIButton){ for path in tableView.indexPathsForVisibleRows! { From 8ea86e75ec6f43a797481787f346ac9fb218fa10 Mon Sep 17 00:00:00 2001 From: Derek316x Date: Sun, 30 Aug 2015 10:55:59 -0400 Subject: [PATCH 57/79] dsf git commit -m dsf --- .../Timer Demo/Base.lproj/Main.storyboard | 83 +++++++++++++------ .../Timer Demo/StopwatchViewController.swift | 12 ++- 2 files changed, 65 insertions(+), 30 deletions(-) diff --git a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard index 4fbdc7d..3d239fd 100644 --- a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard +++ b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard @@ -30,7 +30,11 @@ - + + + + + @@ -151,7 +155,7 @@ - + @@ -228,15 +232,8 @@ - - + @@ -253,7 +250,7 @@ - + @@ -311,19 +308,44 @@ + + + + + + + + + + + + + + + - + - - - + + + @@ -331,10 +353,8 @@ - - @@ -343,8 +363,6 @@ - - @@ -354,22 +372,27 @@ - + + + + + + - + - + - + @@ -378,8 +401,8 @@ - - + @@ -401,12 +411,6 @@ - @@ -428,14 +432,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + - + + + @@ -446,7 +561,7 @@ - + diff --git a/Timer Demo/Timer Demo/CountdownTableViewCell.swift b/Timer Demo/Timer Demo/CountdownTableViewCell.swift new file mode 100644 index 0000000..5dfa382 --- /dev/null +++ b/Timer Demo/Timer Demo/CountdownTableViewCell.swift @@ -0,0 +1,37 @@ +// +// CountdownTableViewCell.swift +// Timer Demo +// +// Created by Z on 8/30/15. +// Copyright © 2015 dereknetto. All rights reserved. +// + +import UIKit + +class CountdownTableViewCell: UITableViewCell { + + @IBOutlet weak var countdownLabel: UILabel! + + @IBOutlet weak var secondsLabel: UILabel! + @IBOutlet weak var minutesLabel: UILabel! + @IBOutlet weak var hoursLabel: UILabel! + @IBOutlet weak var daysLabel: UILabel! + @IBOutlet weak var monthsLabel: UILabel! + @IBOutlet weak var yearsLabel: UILabel! + + var unitLabels = [] + var targetDate = NSDate() + + override func awakeFromNib() { + super.awakeFromNib() + unitLabels = [yearsLabel, monthsLabel, daysLabel, hoursLabel, minutesLabel, secondsLabel] + + + } + + override func setSelected(selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + // Configure the view for the selected state + } + +} diff --git a/Timer Demo/Timer Demo/CountdownViewController.swift b/Timer Demo/Timer Demo/CountdownViewController.swift index 3b8df8a..e9f0b03 100644 --- a/Timer Demo/Timer Demo/CountdownViewController.swift +++ b/Timer Demo/Timer Demo/CountdownViewController.swift @@ -8,31 +8,53 @@ import UIKit -class CountdownViewController: UIViewController, AddCountdownViewControllerDelegate { +class CountdownViewController: UIViewController, + UITableViewDataSource, + UITableViewDelegate, + AddCountdownViewControllerDelegate { - @IBOutlet weak var timeToTargetDateLabel: UILabel! @IBOutlet weak var navigationBar: UINavigationItem! - var targetDate : NSDate? - var displayLink : CADisplayLink! + @IBOutlet weak var tableView: UITableView! + var displayLink : CADisplayLink! + var targetDates : [NSDate] = [] + override func viewDidLoad() { super.viewDidLoad() - displayLink = CADisplayLink(target: self, selector: Selector("updateTimeToTargetDate")) + displayLink = CADisplayLink(target: self, selector: Selector("update")) displayLink.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes) + tableView.delegate = self + tableView.dataSource = self + } + + func update(){ + tableView.reloadData() } - func updateTimeToTargetDate(){ - if let setTargetDate = targetDate{ + func timeToTargetDate(targetDate: NSDate) -> NSTimeInterval{ let currentDate = NSDate() - let timeToTargetDate = setTargetDate.timeIntervalSinceDate(currentDate) - timeToTargetDateLabel.text = timeToTargetDate.stringFromTimeInterval(false) - } + let timeToTargetDate = targetDate.timeIntervalSinceDate(currentDate) + return timeToTargetDate + } + + //MARK: TableView methods + func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return targetDates.count + } + + func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + + let cell = tableView.dequeueReusableCellWithIdentifier("CountdownCell", forIndexPath: indexPath) as! CountdownTableViewCell + + cell.targetDate = targetDates[indexPath.row] + cell.textLabel?.text = timeToTargetDate(cell.targetDate).stringFromTimeInterval(false) + + return cell } //MARK: AddCountdownViewControllerDelegate method func addCountdownViewController(viewController: AddCountdownViewController, didCreateNewCountdown targetDate: NSDate, name: String) { - self.targetDate = targetDate - navigationBar.prompt = name + targetDates.append(targetDate) } //MARK: Segue methods diff --git a/Timer Demo/Timer Demo/TimeUtilities.swift b/Timer Demo/Timer Demo/TimeUtilities.swift index deff165..22678b1 100644 --- a/Timer Demo/Timer Demo/TimeUtilities.swift +++ b/Timer Demo/Timer Demo/TimeUtilities.swift @@ -58,4 +58,8 @@ extension NSTimeInterval{ return timeString } + func largestTimeUnit(){ + + } + } From d92bcd552b7eeb937c8cd090ff993dfec72082a5 Mon Sep 17 00:00:00 2001 From: JovannyEspinal Date: Sun, 30 Aug 2015 15:16:27 -0400 Subject: [PATCH 59/79] Storyboard edit --- .../Timer Demo/Base.lproj/Main.storyboard | 69 +++++++++++-------- 1 file changed, 42 insertions(+), 27 deletions(-) diff --git a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard index 9cc2615..0ca063e 100644 --- a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard +++ b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard @@ -1,7 +1,7 @@ - + - + @@ -20,15 +20,18 @@ + - + - + + + - + @@ -45,7 +48,8 @@ - + + @@ -66,7 +70,7 @@ - + @@ -75,7 +79,7 @@ - + @@ -189,16 +193,16 @@ - + - + - + @@ -231,6 +235,24 @@ + + + + + + + + + + + + + + + + + + @@ -246,7 +268,7 @@ - + @@ -311,13 +333,6 @@ - - - - - - - @@ -344,25 +359,22 @@ - + - - + - - @@ -371,6 +383,7 @@ + @@ -387,6 +400,7 @@ + @@ -397,7 +411,7 @@ - + @@ -566,7 +580,7 @@ - + @@ -743,7 +757,7 @@ - + @@ -757,4 +771,5 @@ + From 7208385580cc414d90c59560397bdd0b56ebd06f Mon Sep 17 00:00:00 2001 From: Derek316x Date: Sun, 30 Aug 2015 15:18:27 -0400 Subject: [PATCH 60/79] i --- .../Timer Demo/CountdownTableViewCell.swift | 23 +++++++-- .../Timer Demo/CountdownViewController.swift | 8 +--- Timer Demo/Timer Demo/TimeUtilities.swift | 48 ++++++++++++++++--- 3 files changed, 62 insertions(+), 17 deletions(-) diff --git a/Timer Demo/Timer Demo/CountdownTableViewCell.swift b/Timer Demo/Timer Demo/CountdownTableViewCell.swift index 5dfa382..7baf62e 100644 --- a/Timer Demo/Timer Demo/CountdownTableViewCell.swift +++ b/Timer Demo/Timer Demo/CountdownTableViewCell.swift @@ -20,18 +20,33 @@ class CountdownTableViewCell: UITableViewCell { @IBOutlet weak var yearsLabel: UILabel! var unitLabels = [] - var targetDate = NSDate() + var targetDate : NSDate? override func awakeFromNib() { super.awakeFromNib() - unitLabels = [yearsLabel, monthsLabel, daysLabel, hoursLabel, minutesLabel, secondsLabel] - + countdownLabel.adjustsFontSizeToFitWidth = true; + unitLabels = [secondsLabel, minutesLabel, hoursLabel, daysLabel, monthsLabel, yearsLabel] + setLabelVisibilities() } override func setSelected(selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) // Configure the view for the selected state } - + + func setLabelVisibilities() { + guard let date = self.targetDate where self.targetDate != nil else { return } + + let largestTimeUnit = timeToTargetDate(date).largestTimeUnit() + + for (idx, unitLabel) in unitLabels.enumerate() { + if (idx < largestTimeUnit.rawValue - 1){ //Year.rawVale = 6 + (unitLabel as! UILabel).hidden = false + } + else{ + (unitLabel as! UILabel).hidden = true + } + } + } } diff --git a/Timer Demo/Timer Demo/CountdownViewController.swift b/Timer Demo/Timer Demo/CountdownViewController.swift index e9f0b03..878e855 100644 --- a/Timer Demo/Timer Demo/CountdownViewController.swift +++ b/Timer Demo/Timer Demo/CountdownViewController.swift @@ -31,12 +31,6 @@ class CountdownViewController: UIViewController, tableView.reloadData() } - func timeToTargetDate(targetDate: NSDate) -> NSTimeInterval{ - let currentDate = NSDate() - let timeToTargetDate = targetDate.timeIntervalSinceDate(currentDate) - return timeToTargetDate - } - //MARK: TableView methods func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return targetDates.count @@ -47,7 +41,7 @@ class CountdownViewController: UIViewController, let cell = tableView.dequeueReusableCellWithIdentifier("CountdownCell", forIndexPath: indexPath) as! CountdownTableViewCell cell.targetDate = targetDates[indexPath.row] - cell.textLabel?.text = timeToTargetDate(cell.targetDate).stringFromTimeInterval(false) + cell.countdownLabel.text = timeToTargetDate(cell.targetDate!).stringFromTimeInterval(false) return cell } diff --git a/Timer Demo/Timer Demo/TimeUtilities.swift b/Timer Demo/Timer Demo/TimeUtilities.swift index 22678b1..9205ac1 100644 --- a/Timer Demo/Timer Demo/TimeUtilities.swift +++ b/Timer Demo/Timer Demo/TimeUtilities.swift @@ -8,11 +8,20 @@ import UIKit +func timeToTargetDate(targetDate: NSDate) -> NSTimeInterval{ + let currentDate = NSDate() + let timeToTargetDate = targetDate.timeIntervalSinceDate(currentDate) + return timeToTargetDate +} + +enum unit: Int { + case Millisecond, Second, Minute, Hour, Day, Month, Year +} + extension NSTimeInterval{ - func stringFromTimeInterval(withMilliseconds:Bool) -> String{ + func timeUnits() -> [Int]{ let intInterval = Int(self) - let years = (intInterval / 31556900) let months = (intInterval / 2629740) % 12 let days = (intInterval / (3600 * 24)) % 365 @@ -21,7 +30,11 @@ extension NSTimeInterval{ let seconds = intInterval % 60 let milliseconds = Int(floor(((self - floor(self)) * 100))) - let timeUnits = [years, months, days, hours, minutes, seconds, milliseconds] + return [years, months, days, hours, minutes, seconds, milliseconds] + } + + func stringFromTimeInterval(withMilliseconds:Bool) -> String{ + let timeUnits = self.timeUnits() var foundFirstNonzero = false var timeString = "" @@ -58,8 +71,31 @@ extension NSTimeInterval{ return timeString } - func largestTimeUnit(){ - + func largestTimeUnit() -> unit{ + var unitID = 0 + for (idx, unit) in self.timeUnits().enumerate() { + if unit > 0{ + unitID = idx + break + } + } + switch unitID{ + case 0: + return .Year + case 1: + return .Month + case 2: + return .Day + case 3: + return .Hour + case 4: + return .Minute + case 5: + return .Second + case 6: + return .Millisecond + default: + return .Day + } } - } From 7c2159bfc59a7869b407c72974fc25f59d63c460 Mon Sep 17 00:00:00 2001 From: Derek316x Date: Sun, 30 Aug 2015 15:21:15 -0400 Subject: [PATCH 61/79] d --- Timer Demo/Timer Demo/Base.lproj/Main.storyboard | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard index 0ca063e..65135e4 100644 --- a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard +++ b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard @@ -1,7 +1,7 @@ - + - + @@ -458,7 +458,7 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -345,7 +418,7 @@ @@ -413,6 +486,24 @@ + + + + + + + + + + + + + + + + + + @@ -422,32 +513,11 @@ - + - - - - - - - - - - - - - - - - - - - - - - + @@ -549,23 +619,20 @@ - + - + - - - @@ -573,15 +640,20 @@ - + + + + + + + - - + @@ -592,10 +664,10 @@ - + - + @@ -651,19 +723,19 @@ - + - + - - + - - - - - - - - - - - - - - - - + + + @@ -191,49 +162,189 @@ - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - + + - - - - - - - - - - - + + - @@ -517,7 +628,7 @@ - + @@ -619,7 +730,7 @@ - + @@ -629,7 +740,7 @@ - + From 006acb14f6e2c72923b3fa5c2fe6f2edd0b0da26 Mon Sep 17 00:00:00 2001 From: Derek316x Date: Sun, 30 Aug 2015 16:32:11 -0400 Subject: [PATCH 66/79] z --- Timer Demo/Timer Demo/Base.lproj/Main.storyboard | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard index 54b04c8..88f251d 100644 --- a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard +++ b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard @@ -1,7 +1,7 @@ - + - + From 52c2be9f8202c3100781da5bf7d67d926cf33133 Mon Sep 17 00:00:00 2001 From: Derek316x Date: Sun, 30 Aug 2015 18:01:00 -0400 Subject: [PATCH 67/79] j --- .../Timer Demo.xcodeproj/project.pbxproj | 4 + .../AddCountdownViewController.swift | 13 +- .../Timer Demo/Base.lproj/Main.storyboard | 345 +++++++++++++----- Timer Demo/Timer Demo/Countdown.swift | 21 ++ .../Timer Demo/CountdownTableViewCell.swift | 5 +- .../Timer Demo/CountdownViewController.swift | 15 +- 6 files changed, 305 insertions(+), 98 deletions(-) create mode 100644 Timer Demo/Timer Demo/Countdown.swift diff --git a/Timer Demo/Timer Demo.xcodeproj/project.pbxproj b/Timer Demo/Timer Demo.xcodeproj/project.pbxproj index 1e23fef..85f220d 100644 --- a/Timer Demo/Timer Demo.xcodeproj/project.pbxproj +++ b/Timer Demo/Timer Demo.xcodeproj/project.pbxproj @@ -13,6 +13,7 @@ 504DC2311B922AB60071A35E /* LoudAlarmClockBuzzer.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = 504DC2301B922AB60071A35E /* LoudAlarmClockBuzzer.mp3 */; }; 504DC2331B922CF30071A35E /* AddTimerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504DC2321B922CF30071A35E /* AddTimerViewController.swift */; }; 691BEA121B935EBF000CF91E /* CountdownTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 691BEA111B935EBF000CF91E /* CountdownTableViewCell.swift */; }; + 693E17541B93AF2800CCC1EE /* Countdown.swift in Sources */ = {isa = PBXBuildFile; fileRef = 693E17531B93AF2800CCC1EE /* Countdown.swift */; }; 6981737C1B88EFF0000D38F2 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6981737B1B88EFF0000D38F2 /* AppDelegate.swift */; }; 6981737E1B88EFF0000D38F2 /* TimerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6981737D1B88EFF0000D38F2 /* TimerViewController.swift */; }; 698173811B88EFF0000D38F2 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6981737F1B88EFF0000D38F2 /* Main.storyboard */; }; @@ -50,6 +51,7 @@ 504DC2301B922AB60071A35E /* LoudAlarmClockBuzzer.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = LoudAlarmClockBuzzer.mp3; sourceTree = ""; }; 504DC2321B922CF30071A35E /* AddTimerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AddTimerViewController.swift; path = ../AddTimerViewController.swift; sourceTree = ""; }; 691BEA111B935EBF000CF91E /* CountdownTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CountdownTableViewCell.swift; sourceTree = ""; }; + 693E17531B93AF2800CCC1EE /* Countdown.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Countdown.swift; sourceTree = ""; }; 698173781B88EFF0000D38F2 /* Timer Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Timer Demo.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 6981737B1B88EFF0000D38F2 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 6981737D1B88EFF0000D38F2 /* TimerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimerViewController.swift; sourceTree = ""; }; @@ -126,6 +128,7 @@ 6981737D1B88EFF0000D38F2 /* TimerViewController.swift */, 504DC2321B922CF30071A35E /* AddTimerViewController.swift */, 504DC2281B8FE3E30071A35E /* StopwatchViewController.swift */, + 693E17531B93AF2800CCC1EE /* Countdown.swift */, 691BEA111B935EBF000CF91E /* CountdownTableViewCell.swift */, 69B738361B92B07B00390657 /* CountdownViewController.swift */, 69B738371B92B07B00390657 /* AddCountdownViewController.swift */, @@ -294,6 +297,7 @@ 5016E10C1B89209300C5EFFD /* TableViewCell.swift in Sources */, 504DC2291B8FE3E30071A35E /* StopwatchViewController.swift in Sources */, 69B738391B92B07B00390657 /* AddCountdownViewController.swift in Sources */, + 693E17541B93AF2800CCC1EE /* Countdown.swift in Sources */, 6981737E1B88EFF0000D38F2 /* TimerViewController.swift in Sources */, 6981737C1B88EFF0000D38F2 /* AppDelegate.swift in Sources */, 504DC2331B922CF30071A35E /* AddTimerViewController.swift in Sources */, diff --git a/Timer Demo/Timer Demo/AddCountdownViewController.swift b/Timer Demo/Timer Demo/AddCountdownViewController.swift index a0171db..7ee3584 100644 --- a/Timer Demo/Timer Demo/AddCountdownViewController.swift +++ b/Timer Demo/Timer Demo/AddCountdownViewController.swift @@ -9,7 +9,7 @@ import UIKit protocol AddCountdownViewControllerDelegate { - func addCountdownViewController(viewController: AddCountdownViewController, didCreateNewCountdown targetDate:NSDate, name:String) + func addCountdownViewController(viewController: AddCountdownViewController, didCreateNewCountdown countdown:Countdown) } class AddCountdownViewController: UIViewController { @@ -38,17 +38,20 @@ class AddCountdownViewController: UIViewController { } @IBAction func setCountdownButtonTapped(sender: UIButton) { - if datePicker.date.timeIntervalSinceNow > 0 { //makes sure that target date is in the future + if (datePicker.date.timeIntervalSinceNow > 0) && (timerNameTextField.text != nil){ let newTargetDate = datePicker.date - delegate?.addCountdownViewController(self, didCreateNewCountdown: newTargetDate, name:timerNameTextField.text!) - self.dismissViewControllerAnimated(false, completion: nil) + let newName = timerNameTextField.text + let newCountdown = Countdown(name: newName!, targetDate: newTargetDate) + + delegate?.addCountdownViewController(self, didCreateNewCountdown: newCountdown) + self.dismissViewControllerAnimated(true, completion: nil) } } func dateAndTimeStringsfromDate(date:NSDate) -> ([String]){ let formatter = NSDateFormatter() formatter.dateStyle = .LongStyle - formatter.timeStyle = .MediumStyle + formatter.timeStyle = .ShortStyle let fullString = formatter.stringFromDate(datePicker.date) return (fullString.componentsSeparatedByString(" at ")) } diff --git a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard index 88f251d..0187c2b 100644 --- a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard +++ b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard @@ -627,112 +627,287 @@ - + + + + + - - + + - + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - + + + + + + - - - - @@ -754,7 +929,7 @@ - + @@ -775,10 +950,10 @@ - + - + @@ -834,19 +1009,19 @@ - + - + - - + - - - - + + - - - - - - - + + - - - - + + + + + + + + + + + + + + - - + + - - - - + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + + + - - + @@ -936,7 +866,7 @@ From 5d6a05836e83426b686f4a73d3f408e6d2d4b176 Mon Sep 17 00:00:00 2001 From: JovannyEspinal Date: Mon, 31 Aug 2015 19:38:00 -0400 Subject: [PATCH 77/79] Quick Timer Feature Added --- .../Timer Demo/Base.lproj/Main.storyboard | 92 ++++++++++++------- .../Timer Demo/TimerViewController.swift | 29 ++++++ 2 files changed, 89 insertions(+), 32 deletions(-) diff --git a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard index bc50066..a6abed4 100644 --- a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard +++ b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard @@ -81,7 +81,7 @@ - + @@ -169,7 +169,7 @@ - + - + @@ -190,46 +193,37 @@ - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + @@ -237,6 +231,35 @@ + + + + + + + + + + + + + + + + + + + + + + + @@ -271,7 +294,7 @@ - + @@ -292,7 +315,12 @@ + + + + + diff --git a/Timer Demo/Timer Demo/TimerViewController.swift b/Timer Demo/Timer Demo/TimerViewController.swift index afdb6a4..dfe999b 100644 --- a/Timer Demo/Timer Demo/TimerViewController.swift +++ b/Timer Demo/Timer Demo/TimerViewController.swift @@ -16,6 +16,11 @@ class ViewController: UIViewController, AddTimerViewControllerDelegate { @IBOutlet weak var tableView: UITableView! + @IBOutlet weak var oneMinuteButton: UIButton! + @IBOutlet weak var threeMinuteButton: UIButton! + @IBOutlet weak var fiveMinuteButton: UIButton! + @IBOutlet weak var quickTimerLabel: UILabel! + @IBOutlet weak var quickTimerTextField: UITextField! var displayLink : CADisplayLink! var audioPlayer = AVAudioPlayer() @@ -134,6 +139,30 @@ class ViewController: UIViewController, } } + + @IBAction func oneMinuteTimer(sender: UIButton) { + + let quickTimer = Timer(name: quickTimerTextField.text!, startTime: 60.000) + timers.append(quickTimer) + tableView.reloadData() + + + } + + @IBAction func threeMinuteTimer(sender: UIButton) { + let quickTimer = Timer(name: quickTimerTextField.text!, startTime: 180.000) + timers.append(quickTimer) + tableView.reloadData() + + } + + @IBAction func fiveMinuteTimer(sender: UIButton) { + let quickTimer = Timer(name: quickTimerTextField.text!, startTime: 300.000) + timers.append(quickTimer) + tableView.reloadData() + } + + // MARK: add timer view controller delegate func addTimerViewController(viewController: AddTimerViewController, didCreateNewTimer timer: Timer) { From fd3c6a9a3b41f2b34242f9a59a0b1a92978745e5 Mon Sep 17 00:00:00 2001 From: JovannyEspinal Date: Mon, 31 Aug 2015 20:48:49 -0400 Subject: [PATCH 78/79] Updated UI. Project completion pending review. --- Timer Demo/AddTimerViewController.swift | 1 + .../AddCountdownViewController.swift | 4 ++ .../Timer Demo/Base.lproj/Main.storyboard | 52 ++++++++++--------- .../Timer Demo/CountdownViewController.swift | 5 ++ 4 files changed, 37 insertions(+), 25 deletions(-) diff --git a/Timer Demo/AddTimerViewController.swift b/Timer Demo/AddTimerViewController.swift index 004ea02..556820b 100644 --- a/Timer Demo/AddTimerViewController.swift +++ b/Timer Demo/AddTimerViewController.swift @@ -23,6 +23,7 @@ class AddTimerViewController: UIViewController { super.viewDidLoad() timerPicker.countDownDuration = 60 + // Do any additional setup after loading the view. } diff --git a/Timer Demo/Timer Demo/AddCountdownViewController.swift b/Timer Demo/Timer Demo/AddCountdownViewController.swift index f588c71..c96728f 100644 --- a/Timer Demo/Timer Demo/AddCountdownViewController.swift +++ b/Timer Demo/Timer Demo/AddCountdownViewController.swift @@ -25,6 +25,8 @@ class AddCountdownViewController: UIViewController, UITextFieldDelegate { override func viewDidLoad() { super.viewDidLoad() + + datePicker.backgroundColor = UIColor.groupTableViewBackgroundColor() timerNameTextField.delegate = self updateDateAndTimeLabel() @@ -47,6 +49,8 @@ class AddCountdownViewController: UIViewController, UITextFieldDelegate { let newName = timerNameTextField.text let newCountdown = Countdown(name: newName!, targetDate: newTargetDate) + print(newTargetDate) + delegate?.addCountdownViewController(self, didCreateNewCountdown: newCountdown) self.navigationController?.popViewControllerAnimated(true) diff --git a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard index a6abed4..13eaffb 100644 --- a/Timer Demo/Timer Demo/Base.lproj/Main.storyboard +++ b/Timer Demo/Timer Demo/Base.lproj/Main.storyboard @@ -408,7 +408,7 @@ - + @@ -425,13 +425,13 @@ - + - + - + @@ -1103,6 +1104,7 @@ + @@ -1159,7 +1161,7 @@ - + diff --git a/Timer Demo/Timer Demo/CountdownViewController.swift b/Timer Demo/Timer Demo/CountdownViewController.swift index 59e5385..477ff52 100644 --- a/Timer Demo/Timer Demo/CountdownViewController.swift +++ b/Timer Demo/Timer Demo/CountdownViewController.swift @@ -29,6 +29,11 @@ class CountdownViewController: UIViewController, displayLink.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes) tableView.delegate = self tableView.dataSource = self + + + + + } func update(){ From 33c932145f93945b3535b92346092b295dbeed43 Mon Sep 17 00:00:00 2001 From: JovannyEspinal Date: Mon, 31 Aug 2015 20:54:08 -0400 Subject: [PATCH 79/79] Removed unneccessary files --- Countdown/Countdown.xcodeproj/project.pbxproj | 517 ------------------ .../contents.xcworkspacedata | 7 - .../AddCountdownViewController.swift | 56 -- Countdown/Countdown/AppDelegate.swift | 46 -- .../AppIcon.appiconset/Contents.json | 68 --- .../Base.lproj/LaunchScreen.storyboard | 49 -- .../Countdown/Base.lproj/Main.storyboard | 237 -------- .../Countdown/CountdownViewController.swift | 43 -- Countdown/Countdown/Info.plist | 47 -- Countdown/Countdown/TimeUtilities.swift | 61 --- Countdown/CountdownTests/CountdownTests.swift | 35 -- Countdown/CountdownTests/Info.plist | 24 - .../CountdownUITests/CountdownUITests.swift | 35 -- Countdown/CountdownUITests/Info.plist | 24 - MyPlayground.playground/Contents.swift | 18 - MyPlayground.playground/contents.xcplayground | 4 - .../contents.xcworkspacedata | 7 - MyPlayground.playground/timeline.xctimeline | 6 - Stopwatch/Stopwatch.xcodeproj/project.pbxproj | 511 ----------------- .../contents.xcworkspacedata | 7 - Stopwatch/Stopwatch/AppDelegate.swift | 46 -- .../AppIcon.appiconset/Contents.json | 38 -- .../Stopwatch/Assets.xcassets/Contents.json | 6 - .../lap.imageset/Contents.json | 21 - .../Assets.xcassets/lap.imageset/lap.png | Bin 2397 -> 0 bytes .../reset.imageset/Contents.json | 21 - .../Assets.xcassets/reset.imageset/reset.png | Bin 2905 -> 0 bytes .../start.imageset/Contents.json | 21 - .../Assets.xcassets/start.imageset/start.png | Bin 2519 -> 0 bytes .../stop.imageset/Contents.json | 21 - .../Assets.xcassets/stop.imageset/stop.png | Bin 2452 -> 0 bytes .../Base.lproj/LaunchScreen.storyboard | 27 - .../Stopwatch/Base.lproj/Main.storyboard | 7 - Stopwatch/Stopwatch/Info.plist | 40 -- Stopwatch/Stopwatch/ViewController.swift | 179 ------ Stopwatch/StopwatchTests/Info.plist | 24 - Stopwatch/StopwatchTests/StopwatchTests.swift | 36 -- Stopwatch/StopwatchUITests/Info.plist | 24 - .../StopwatchUITests/StopwatchUITests.swift | 34 -- .../project.pbxproj | 506 ----------------- .../contents.xcworkspacedata | 7 - .../AppDelegate.swift | 46 -- .../AppIcon.appiconset/Contents.json | 68 --- .../Base.lproj/LaunchScreen.storyboard | 49 -- .../Base.lproj/Main.storyboard | 61 --- .../StringFromTimeIntervalDemo/Info.plist | 47 -- .../ViewController.swift | 80 --- .../Info.plist | 24 - .../StringFromTimeIntervalDemoTests.swift | 35 -- .../Info.plist | 24 - .../StringFromTimeIntervalDemoUITests.swift | 35 -- 51 files changed, 3329 deletions(-) delete mode 100644 Countdown/Countdown.xcodeproj/project.pbxproj delete mode 100644 Countdown/Countdown.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 Countdown/Countdown/AddCountdownViewController.swift delete mode 100644 Countdown/Countdown/AppDelegate.swift delete mode 100644 Countdown/Countdown/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 Countdown/Countdown/Base.lproj/LaunchScreen.storyboard delete mode 100644 Countdown/Countdown/Base.lproj/Main.storyboard delete mode 100644 Countdown/Countdown/CountdownViewController.swift delete mode 100644 Countdown/Countdown/Info.plist delete mode 100644 Countdown/Countdown/TimeUtilities.swift delete mode 100644 Countdown/CountdownTests/CountdownTests.swift delete mode 100644 Countdown/CountdownTests/Info.plist delete mode 100644 Countdown/CountdownUITests/CountdownUITests.swift delete mode 100644 Countdown/CountdownUITests/Info.plist delete mode 100644 MyPlayground.playground/Contents.swift delete mode 100644 MyPlayground.playground/contents.xcplayground delete mode 100644 MyPlayground.playground/playground.xcworkspace/contents.xcworkspacedata delete mode 100644 MyPlayground.playground/timeline.xctimeline delete mode 100644 Stopwatch/Stopwatch.xcodeproj/project.pbxproj delete mode 100644 Stopwatch/Stopwatch.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 Stopwatch/Stopwatch/AppDelegate.swift delete mode 100644 Stopwatch/Stopwatch/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 Stopwatch/Stopwatch/Assets.xcassets/Contents.json delete mode 100644 Stopwatch/Stopwatch/Assets.xcassets/lap.imageset/Contents.json delete mode 100644 Stopwatch/Stopwatch/Assets.xcassets/lap.imageset/lap.png delete mode 100644 Stopwatch/Stopwatch/Assets.xcassets/reset.imageset/Contents.json delete mode 100644 Stopwatch/Stopwatch/Assets.xcassets/reset.imageset/reset.png delete mode 100644 Stopwatch/Stopwatch/Assets.xcassets/start.imageset/Contents.json delete mode 100644 Stopwatch/Stopwatch/Assets.xcassets/start.imageset/start.png delete mode 100644 Stopwatch/Stopwatch/Assets.xcassets/stop.imageset/Contents.json delete mode 100644 Stopwatch/Stopwatch/Assets.xcassets/stop.imageset/stop.png delete mode 100644 Stopwatch/Stopwatch/Base.lproj/LaunchScreen.storyboard delete mode 100644 Stopwatch/Stopwatch/Base.lproj/Main.storyboard delete mode 100644 Stopwatch/Stopwatch/Info.plist delete mode 100644 Stopwatch/Stopwatch/ViewController.swift delete mode 100644 Stopwatch/StopwatchTests/Info.plist delete mode 100644 Stopwatch/StopwatchTests/StopwatchTests.swift delete mode 100644 Stopwatch/StopwatchUITests/Info.plist delete mode 100644 Stopwatch/StopwatchUITests/StopwatchUITests.swift delete mode 100644 StringFromTimeIntervalDemo/StringFromTimeIntervalDemo.xcodeproj/project.pbxproj delete mode 100644 StringFromTimeIntervalDemo/StringFromTimeIntervalDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/AppDelegate.swift delete mode 100644 StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/Base.lproj/LaunchScreen.storyboard delete mode 100644 StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/Base.lproj/Main.storyboard delete mode 100644 StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/Info.plist delete mode 100644 StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/ViewController.swift delete mode 100644 StringFromTimeIntervalDemo/StringFromTimeIntervalDemoTests/Info.plist delete mode 100644 StringFromTimeIntervalDemo/StringFromTimeIntervalDemoTests/StringFromTimeIntervalDemoTests.swift delete mode 100644 StringFromTimeIntervalDemo/StringFromTimeIntervalDemoUITests/Info.plist delete mode 100644 StringFromTimeIntervalDemo/StringFromTimeIntervalDemoUITests/StringFromTimeIntervalDemoUITests.swift diff --git a/Countdown/Countdown.xcodeproj/project.pbxproj b/Countdown/Countdown.xcodeproj/project.pbxproj deleted file mode 100644 index 8566a42..0000000 --- a/Countdown/Countdown.xcodeproj/project.pbxproj +++ /dev/null @@ -1,517 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 69713F411B922D2E00FCEA28 /* CountdownViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69713F401B922D2E00FCEA28 /* CountdownViewController.swift */; }; - 69713F431B923F8E00FCEA28 /* TimeUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69713F421B923F8E00FCEA28 /* TimeUtilities.swift */; }; - 69E810151B91F6B30061915A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69E810141B91F6B30061915A /* AppDelegate.swift */; }; - 69E8101A1B91F6B30061915A /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 69E810181B91F6B30061915A /* Main.storyboard */; }; - 69E8101C1B91F6B30061915A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 69E8101B1B91F6B30061915A /* Assets.xcassets */; }; - 69E8101F1B91F6B30061915A /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 69E8101D1B91F6B30061915A /* LaunchScreen.storyboard */; }; - 69E8102A1B91F6B30061915A /* CountdownTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69E810291B91F6B30061915A /* CountdownTests.swift */; }; - 69E810351B91F6B30061915A /* CountdownUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69E810341B91F6B30061915A /* CountdownUITests.swift */; }; - 69EC94271B92548B00FC026D /* AddCountdownViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69EC94261B92548B00FC026D /* AddCountdownViewController.swift */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 69E810261B91F6B30061915A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 69E810091B91F6B30061915A /* Project object */; - proxyType = 1; - remoteGlobalIDString = 69E810101B91F6B30061915A; - remoteInfo = Countdown; - }; - 69E810311B91F6B30061915A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 69E810091B91F6B30061915A /* Project object */; - proxyType = 1; - remoteGlobalIDString = 69E810101B91F6B30061915A; - remoteInfo = Countdown; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 69713F401B922D2E00FCEA28 /* CountdownViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CountdownViewController.swift; sourceTree = ""; }; - 69713F421B923F8E00FCEA28 /* TimeUtilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TimeUtilities.swift; sourceTree = ""; }; - 69E810111B91F6B30061915A /* Countdown.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Countdown.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 69E810141B91F6B30061915A /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 69E810191B91F6B30061915A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 69E8101B1B91F6B30061915A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 69E8101E1B91F6B30061915A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 69E810201B91F6B30061915A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 69E810251B91F6B30061915A /* CountdownTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CountdownTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 69E810291B91F6B30061915A /* CountdownTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CountdownTests.swift; sourceTree = ""; }; - 69E8102B1B91F6B30061915A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 69E810301B91F6B30061915A /* CountdownUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CountdownUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 69E810341B91F6B30061915A /* CountdownUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CountdownUITests.swift; sourceTree = ""; }; - 69E810361B91F6B30061915A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 69EC94261B92548B00FC026D /* AddCountdownViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddCountdownViewController.swift; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 69E8100E1B91F6B30061915A /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 69E810221B91F6B30061915A /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 69E8102D1B91F6B30061915A /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 69E810081B91F6B30061915A = { - isa = PBXGroup; - children = ( - 69E810131B91F6B30061915A /* Countdown */, - 69E810281B91F6B30061915A /* CountdownTests */, - 69E810331B91F6B30061915A /* CountdownUITests */, - 69E810121B91F6B30061915A /* Products */, - ); - sourceTree = ""; - }; - 69E810121B91F6B30061915A /* Products */ = { - isa = PBXGroup; - children = ( - 69E810111B91F6B30061915A /* Countdown.app */, - 69E810251B91F6B30061915A /* CountdownTests.xctest */, - 69E810301B91F6B30061915A /* CountdownUITests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 69E810131B91F6B30061915A /* Countdown */ = { - isa = PBXGroup; - children = ( - 69E810141B91F6B30061915A /* AppDelegate.swift */, - 69713F421B923F8E00FCEA28 /* TimeUtilities.swift */, - 69713F401B922D2E00FCEA28 /* CountdownViewController.swift */, - 69EC94261B92548B00FC026D /* AddCountdownViewController.swift */, - 69E810181B91F6B30061915A /* Main.storyboard */, - 69E8101B1B91F6B30061915A /* Assets.xcassets */, - 69E8101D1B91F6B30061915A /* LaunchScreen.storyboard */, - 69E810201B91F6B30061915A /* Info.plist */, - ); - path = Countdown; - sourceTree = ""; - }; - 69E810281B91F6B30061915A /* CountdownTests */ = { - isa = PBXGroup; - children = ( - 69E810291B91F6B30061915A /* CountdownTests.swift */, - 69E8102B1B91F6B30061915A /* Info.plist */, - ); - path = CountdownTests; - sourceTree = ""; - }; - 69E810331B91F6B30061915A /* CountdownUITests */ = { - isa = PBXGroup; - children = ( - 69E810341B91F6B30061915A /* CountdownUITests.swift */, - 69E810361B91F6B30061915A /* Info.plist */, - ); - path = CountdownUITests; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 69E810101B91F6B30061915A /* Countdown */ = { - isa = PBXNativeTarget; - buildConfigurationList = 69E810391B91F6B30061915A /* Build configuration list for PBXNativeTarget "Countdown" */; - buildPhases = ( - 69E8100D1B91F6B30061915A /* Sources */, - 69E8100E1B91F6B30061915A /* Frameworks */, - 69E8100F1B91F6B30061915A /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Countdown; - productName = Countdown; - productReference = 69E810111B91F6B30061915A /* Countdown.app */; - productType = "com.apple.product-type.application"; - }; - 69E810241B91F6B30061915A /* CountdownTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 69E8103C1B91F6B30061915A /* Build configuration list for PBXNativeTarget "CountdownTests" */; - buildPhases = ( - 69E810211B91F6B30061915A /* Sources */, - 69E810221B91F6B30061915A /* Frameworks */, - 69E810231B91F6B30061915A /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 69E810271B91F6B30061915A /* PBXTargetDependency */, - ); - name = CountdownTests; - productName = CountdownTests; - productReference = 69E810251B91F6B30061915A /* CountdownTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 69E8102F1B91F6B30061915A /* CountdownUITests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 69E8103F1B91F6B30061915A /* Build configuration list for PBXNativeTarget "CountdownUITests" */; - buildPhases = ( - 69E8102C1B91F6B30061915A /* Sources */, - 69E8102D1B91F6B30061915A /* Frameworks */, - 69E8102E1B91F6B30061915A /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 69E810321B91F6B30061915A /* PBXTargetDependency */, - ); - name = CountdownUITests; - productName = CountdownUITests; - productReference = 69E810301B91F6B30061915A /* CountdownUITests.xctest */; - productType = "com.apple.product-type.bundle.ui-testing"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 69E810091B91F6B30061915A /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0700; - ORGANIZATIONNAME = dereknetto; - TargetAttributes = { - 69E810101B91F6B30061915A = { - CreatedOnToolsVersion = 7.0; - }; - 69E810241B91F6B30061915A = { - CreatedOnToolsVersion = 7.0; - TestTargetID = 69E810101B91F6B30061915A; - }; - 69E8102F1B91F6B30061915A = { - CreatedOnToolsVersion = 7.0; - TestTargetID = 69E810101B91F6B30061915A; - }; - }; - }; - buildConfigurationList = 69E8100C1B91F6B30061915A /* Build configuration list for PBXProject "Countdown" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 69E810081B91F6B30061915A; - productRefGroup = 69E810121B91F6B30061915A /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 69E810101B91F6B30061915A /* Countdown */, - 69E810241B91F6B30061915A /* CountdownTests */, - 69E8102F1B91F6B30061915A /* CountdownUITests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 69E8100F1B91F6B30061915A /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 69E8101F1B91F6B30061915A /* LaunchScreen.storyboard in Resources */, - 69E8101C1B91F6B30061915A /* Assets.xcassets in Resources */, - 69E8101A1B91F6B30061915A /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 69E810231B91F6B30061915A /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 69E8102E1B91F6B30061915A /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 69E8100D1B91F6B30061915A /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 69EC94271B92548B00FC026D /* AddCountdownViewController.swift in Sources */, - 69713F411B922D2E00FCEA28 /* CountdownViewController.swift in Sources */, - 69713F431B923F8E00FCEA28 /* TimeUtilities.swift in Sources */, - 69E810151B91F6B30061915A /* AppDelegate.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 69E810211B91F6B30061915A /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 69E8102A1B91F6B30061915A /* CountdownTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 69E8102C1B91F6B30061915A /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 69E810351B91F6B30061915A /* CountdownUITests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 69E810271B91F6B30061915A /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 69E810101B91F6B30061915A /* Countdown */; - targetProxy = 69E810261B91F6B30061915A /* PBXContainerItemProxy */; - }; - 69E810321B91F6B30061915A /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 69E810101B91F6B30061915A /* Countdown */; - targetProxy = 69E810311B91F6B30061915A /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 69E810181B91F6B30061915A /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 69E810191B91F6B30061915A /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 69E8101D1B91F6B30061915A /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 69E8101E1B91F6B30061915A /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 69E810371B91F6B30061915A /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - 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 = 9.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 69E810381B91F6B30061915A /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "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 = gnu99; - 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 = 9.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 69E8103A1B91F6B30061915A /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - INFOPLIST_FILE = Countdown/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = nyc.c4q.Derek316x.Countdown; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 69E8103B1B91F6B30061915A /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - INFOPLIST_FILE = Countdown/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = nyc.c4q.Derek316x.Countdown; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; - 69E8103D1B91F6B30061915A /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - INFOPLIST_FILE = CountdownTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = nyc.c4q.Derek316x.CountdownTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Countdown.app/Countdown"; - }; - name = Debug; - }; - 69E8103E1B91F6B30061915A /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - INFOPLIST_FILE = CountdownTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = nyc.c4q.Derek316x.CountdownTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Countdown.app/Countdown"; - }; - name = Release; - }; - 69E810401B91F6B30061915A /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = CountdownUITests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = nyc.c4q.Derek316x.CountdownUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_TARGET_NAME = Countdown; - USES_XCTRUNNER = YES; - }; - name = Debug; - }; - 69E810411B91F6B30061915A /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = CountdownUITests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = nyc.c4q.Derek316x.CountdownUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_TARGET_NAME = Countdown; - USES_XCTRUNNER = YES; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 69E8100C1B91F6B30061915A /* Build configuration list for PBXProject "Countdown" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 69E810371B91F6B30061915A /* Debug */, - 69E810381B91F6B30061915A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 69E810391B91F6B30061915A /* Build configuration list for PBXNativeTarget "Countdown" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 69E8103A1B91F6B30061915A /* Debug */, - 69E8103B1B91F6B30061915A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 69E8103C1B91F6B30061915A /* Build configuration list for PBXNativeTarget "CountdownTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 69E8103D1B91F6B30061915A /* Debug */, - 69E8103E1B91F6B30061915A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 69E8103F1B91F6B30061915A /* Build configuration list for PBXNativeTarget "CountdownUITests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 69E810401B91F6B30061915A /* Debug */, - 69E810411B91F6B30061915A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 69E810091B91F6B30061915A /* Project object */; -} diff --git a/Countdown/Countdown.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Countdown/Countdown.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index aa17812..0000000 --- a/Countdown/Countdown.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/Countdown/Countdown/AddCountdownViewController.swift b/Countdown/Countdown/AddCountdownViewController.swift deleted file mode 100644 index 051dac8..0000000 --- a/Countdown/Countdown/AddCountdownViewController.swift +++ /dev/null @@ -1,56 +0,0 @@ -// -// AddCountdownViewController.swift -// Countdown -// -// Created by Z on 8/29/15. -// Copyright © 2015 dereknetto. All rights reserved. -// - -import UIKit - -protocol AddCountdownViewControllerDelegate { - func addCountdownViewController(viewController: AddCountdownViewController, didCreateNewCountdown targetDate:NSDate) -} - -class AddCountdownViewController: UIViewController { - - var delegate: AddCountdownViewControllerDelegate? - - @IBOutlet weak var datePicker: UIDatePicker! - @IBOutlet weak var targetDateLabel: UILabel! - @IBOutlet weak var targetTimeLabel: UILabel! - @IBOutlet weak var timerNameTextField: UITextField! - @IBOutlet weak var setCountdownButton: UIButton! - - override func viewDidLoad() { - super.viewDidLoad() - updateDateAndTimeLabel() - } - - func updateDateAndTimeLabel(){ - let dateAndTime = dateAndTimeStringsfromDate(datePicker.date) - targetDateLabel.text = (dateAndTime as NSArray).objectAtIndex(0) as? String - targetTimeLabel.text = (dateAndTime as NSArray).objectAtIndex(1)as? String - } - - @IBAction func datePickerValueChanged(sender: UIDatePicker) { - updateDateAndTimeLabel() - } - - @IBAction func setCountdownButtonTapped(sender: UIButton) { - if datePicker.date.timeIntervalSinceNow > 0 { //makes sure that target date is in the future - let newTargetDate = datePicker.date - delegate?.addCountdownViewController(self, didCreateNewCountdown: newTargetDate) - self.dismissViewControllerAnimated(false, completion: nil) - } - } - - func dateAndTimeStringsfromDate(date:NSDate) -> ([String]){ - let formatter = NSDateFormatter() - formatter.dateStyle = .LongStyle - formatter.timeStyle = .MediumStyle - let fullString = formatter.stringFromDate(datePicker.date) - return (fullString.componentsSeparatedByString(" at ")) - } - -} diff --git a/Countdown/Countdown/AppDelegate.swift b/Countdown/Countdown/AppDelegate.swift deleted file mode 100644 index 5244ad9..0000000 --- a/Countdown/Countdown/AppDelegate.swift +++ /dev/null @@ -1,46 +0,0 @@ -// -// AppDelegate.swift -// Countdown -// -// Created by Z on 8/29/15. -// Copyright © 2015 dereknetto. All rights reserved. -// - -import UIKit - -@UIApplicationMain -class AppDelegate: UIResponder, UIApplicationDelegate { - - var window: UIWindow? - - - func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { - // Override point for customization after application launch. - return true - } - - func applicationWillResignActive(application: UIApplication) { - // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. - } - - func applicationDidEnterBackground(application: UIApplication) { - // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. - } - - func applicationWillEnterForeground(application: UIApplication) { - // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. - } - - func applicationDidBecomeActive(application: UIApplication) { - // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. - } - - func applicationWillTerminate(application: UIApplication) { - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. - } - - -} - diff --git a/Countdown/Countdown/Assets.xcassets/AppIcon.appiconset/Contents.json b/Countdown/Countdown/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 36d2c80..0000000 --- a/Countdown/Countdown/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "images" : [ - { - "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" : "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" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Countdown/Countdown/Base.lproj/LaunchScreen.storyboard b/Countdown/Countdown/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index 013d0aa..0000000 --- a/Countdown/Countdown/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Countdown/Countdown/Base.lproj/Main.storyboard b/Countdown/Countdown/Base.lproj/Main.storyboard deleted file mode 100644 index 68dfa7d..0000000 --- a/Countdown/Countdown/Base.lproj/Main.storyboard +++ /dev/null @@ -1,237 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Countdown/Countdown/CountdownViewController.swift b/Countdown/Countdown/CountdownViewController.swift deleted file mode 100644 index 06af361..0000000 --- a/Countdown/Countdown/CountdownViewController.swift +++ /dev/null @@ -1,43 +0,0 @@ -// -// CountdownViewController.swift -// Countdown -// -// Created by Z on 8/29/15. -// Copyright © 2015 dereknetto. All rights reserved. -// - -import UIKit - -class CountdownViewController: UIViewController, AddCountdownViewControllerDelegate { - - @IBOutlet weak var timeToTargetDateLabel: UILabel! - var targetDate : NSDate? - var displayLink : CADisplayLink! - - override func viewDidLoad() { - super.viewDidLoad() - displayLink = CADisplayLink(target: self, selector: Selector("updateTimeToTargetDate")) - displayLink.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes) - } - - func updateTimeToTargetDate(){ - if let setTargetDate = targetDate{ - let currentDate = NSDate() - let timeToTargetDate = setTargetDate.timeIntervalSinceDate(currentDate) - timeToTargetDateLabel.text = timeToTargetDate.stringFromTimeInterval(false) - } - } - - //MARK: AddCountdownViewControllerDelegate method - func addCountdownViewController(viewController: AddCountdownViewController, didCreateNewCountdown targetDate: NSDate) { - self.targetDate = targetDate - } - - //MARK: Segue methods - override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { - if let viewController = segue.destinationViewController as? AddCountdownViewController { - viewController.delegate = self - } - } - -} diff --git a/Countdown/Countdown/Info.plist b/Countdown/Countdown/Info.plist deleted file mode 100644 index 40c6215..0000000 --- a/Countdown/Countdown/Info.plist +++ /dev/null @@ -1,47 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/Countdown/Countdown/TimeUtilities.swift b/Countdown/Countdown/TimeUtilities.swift deleted file mode 100644 index deff165..0000000 --- a/Countdown/Countdown/TimeUtilities.swift +++ /dev/null @@ -1,61 +0,0 @@ -// -// TimeUtilities.swift -// Countdown -// -// Created by Z on 8/29/15. -// Copyright © 2015 dereknetto. All rights reserved. -// - -import UIKit - -extension NSTimeInterval{ - - func stringFromTimeInterval(withMilliseconds:Bool) -> String{ - let intInterval = Int(self) - - let years = (intInterval / 31556900) - let months = (intInterval / 2629740) % 12 - let days = (intInterval / (3600 * 24)) % 365 - let hours = (intInterval / 3600) % 24 - let minutes = (intInterval / 60) % 60 - let seconds = intInterval % 60 - let milliseconds = Int(floor(((self - floor(self)) * 100))) - - let timeUnits = [years, months, days, hours, minutes, seconds, milliseconds] - - var foundFirstNonzero = false - var timeString = "" - - // remove leading 0s - for (idx, unit) in timeUnits.enumerate() { - if unit == 0 && !foundFirstNonzero { - continue - } - foundFirstNonzero = true - let unitString = unit > 9 ? "\(unit)" : "0\(unit)" - - if (withMilliseconds == true){ - if idx == timeUnits.count - 1 { - timeString = timeString + unitString - } - else if (idx == timeUnits.count - 2){ - timeString = timeString + unitString + "." - }else{ - timeString = timeString + unitString + ":" - } - }else{ - if idx == timeUnits.count - 1 { - //do nothing - } - else if (idx == timeUnits.count - 2){ - timeString = timeString + unitString - }else{ - timeString = timeString + unitString + ":" - } - } - } - - return timeString - } - -} diff --git a/Countdown/CountdownTests/CountdownTests.swift b/Countdown/CountdownTests/CountdownTests.swift deleted file mode 100644 index 83db825..0000000 --- a/Countdown/CountdownTests/CountdownTests.swift +++ /dev/null @@ -1,35 +0,0 @@ -// -// CountdownTests.swift -// CountdownTests -// -// Created by Z on 8/29/15. -// Copyright © 2015 dereknetto. All rights reserved. -// - -import XCTest - -class CountdownTests: XCTestCase { - - override func setUp() { - super.setUp() - // Put setup code here. This method is called before the invocation of each test method in the class. - } - - override func tearDown() { - // Put teardown code here. This method is called after the invocation of each test method in the class. - super.tearDown() - } - - func testExample() { - // This is an example of a functional test case. - // Use XCTAssert and related functions to verify your tests produce the correct results. - } - - func testPerformanceExample() { - // This is an example of a performance test case. - self.measureBlock() { - // Put the code you want to measure the time of here. - } - } - -} diff --git a/Countdown/CountdownTests/Info.plist b/Countdown/CountdownTests/Info.plist deleted file mode 100644 index ba72822..0000000 --- a/Countdown/CountdownTests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/Countdown/CountdownUITests/CountdownUITests.swift b/Countdown/CountdownUITests/CountdownUITests.swift deleted file mode 100644 index b2d7725..0000000 --- a/Countdown/CountdownUITests/CountdownUITests.swift +++ /dev/null @@ -1,35 +0,0 @@ -// -// CountdownUITests.swift -// CountdownUITests -// -// Created by Z on 8/29/15. -// Copyright © 2015 dereknetto. All rights reserved. -// - -import Foundation -import XCTest - -class CountdownUITests: XCTestCase { - - override func setUp() { - super.setUp() - - // Put setup code here. This method is called before the invocation of each test method in the class. - - // In UI tests it is usually best to stop immediately when a failure occurs. - continueAfterFailure = false - // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. - XCUIApplication().launch() - } - - override func tearDown() { - // Put teardown code here. This method is called after the invocation of each test method in the class. - super.tearDown() - } - - func testExample() { - // Use recording to get started writing UI tests. - // Use XCTAssert and related functions to verify your tests produce the correct results. - } - -} diff --git a/Countdown/CountdownUITests/Info.plist b/Countdown/CountdownUITests/Info.plist deleted file mode 100644 index ba72822..0000000 --- a/Countdown/CountdownUITests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/MyPlayground.playground/Contents.swift b/MyPlayground.playground/Contents.swift deleted file mode 100644 index 811278b..0000000 --- a/MyPlayground.playground/Contents.swift +++ /dev/null @@ -1,18 +0,0 @@ -//: Playground - noun: a place where people can play - -import UIKit - -var str = "Hello, playground" - -var ratio = 50.0/3.0 - -let poop = 200.0/3.0 - - - - - - - - - diff --git a/MyPlayground.playground/contents.xcplayground b/MyPlayground.playground/contents.xcplayground deleted file mode 100644 index ee7c14f..0000000 --- a/MyPlayground.playground/contents.xcplayground +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/MyPlayground.playground/playground.xcworkspace/contents.xcworkspacedata b/MyPlayground.playground/playground.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/MyPlayground.playground/playground.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/MyPlayground.playground/timeline.xctimeline b/MyPlayground.playground/timeline.xctimeline deleted file mode 100644 index bf468af..0000000 --- a/MyPlayground.playground/timeline.xctimeline +++ /dev/null @@ -1,6 +0,0 @@ - - - - - diff --git a/Stopwatch/Stopwatch.xcodeproj/project.pbxproj b/Stopwatch/Stopwatch.xcodeproj/project.pbxproj deleted file mode 100644 index e9c008f..0000000 --- a/Stopwatch/Stopwatch.xcodeproj/project.pbxproj +++ /dev/null @@ -1,511 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 5028B52E1B87DC1F00CB0B34 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5028B52D1B87DC1F00CB0B34 /* AppDelegate.swift */; }; - 5028B5301B87DC1F00CB0B34 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5028B52F1B87DC1F00CB0B34 /* ViewController.swift */; }; - 5028B5331B87DC1F00CB0B34 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5028B5311B87DC1F00CB0B34 /* Main.storyboard */; }; - 5028B5351B87DC1F00CB0B34 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5028B5341B87DC1F00CB0B34 /* Assets.xcassets */; }; - 5028B5381B87DC1F00CB0B34 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5028B5361B87DC1F00CB0B34 /* LaunchScreen.storyboard */; }; - 5028B5431B87DC1F00CB0B34 /* StopwatchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5028B5421B87DC1F00CB0B34 /* StopwatchTests.swift */; }; - 5028B54E1B87DC2000CB0B34 /* StopwatchUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5028B54D1B87DC2000CB0B34 /* StopwatchUITests.swift */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 5028B53F1B87DC1F00CB0B34 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 5028B5221B87DC1F00CB0B34 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5028B5291B87DC1F00CB0B34; - remoteInfo = Stopwatch; - }; - 5028B54A1B87DC2000CB0B34 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 5028B5221B87DC1F00CB0B34 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5028B5291B87DC1F00CB0B34; - remoteInfo = Stopwatch; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 5028B52A1B87DC1F00CB0B34 /* Stopwatch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Stopwatch.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 5028B52D1B87DC1F00CB0B34 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 5028B52F1B87DC1F00CB0B34 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - 5028B5321B87DC1F00CB0B34 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 5028B5341B87DC1F00CB0B34 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 5028B5371B87DC1F00CB0B34 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 5028B5391B87DC1F00CB0B34 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 5028B53E1B87DC1F00CB0B34 /* StopwatchTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = StopwatchTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 5028B5421B87DC1F00CB0B34 /* StopwatchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StopwatchTests.swift; sourceTree = ""; }; - 5028B5441B87DC1F00CB0B34 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 5028B5491B87DC2000CB0B34 /* StopwatchUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = StopwatchUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 5028B54D1B87DC2000CB0B34 /* StopwatchUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StopwatchUITests.swift; sourceTree = ""; }; - 5028B54F1B87DC2000CB0B34 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 5028B5271B87DC1F00CB0B34 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5028B53B1B87DC1F00CB0B34 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5028B5461B87DC2000CB0B34 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 5028B5211B87DC1F00CB0B34 = { - isa = PBXGroup; - children = ( - 5028B52C1B87DC1F00CB0B34 /* Stopwatch */, - 5028B5411B87DC1F00CB0B34 /* StopwatchTests */, - 5028B54C1B87DC2000CB0B34 /* StopwatchUITests */, - 5028B52B1B87DC1F00CB0B34 /* Products */, - ); - sourceTree = ""; - }; - 5028B52B1B87DC1F00CB0B34 /* Products */ = { - isa = PBXGroup; - children = ( - 5028B52A1B87DC1F00CB0B34 /* Stopwatch.app */, - 5028B53E1B87DC1F00CB0B34 /* StopwatchTests.xctest */, - 5028B5491B87DC2000CB0B34 /* StopwatchUITests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 5028B52C1B87DC1F00CB0B34 /* Stopwatch */ = { - isa = PBXGroup; - children = ( - 5028B52D1B87DC1F00CB0B34 /* AppDelegate.swift */, - 5028B52F1B87DC1F00CB0B34 /* ViewController.swift */, - 5028B5311B87DC1F00CB0B34 /* Main.storyboard */, - 5028B5341B87DC1F00CB0B34 /* Assets.xcassets */, - 5028B5361B87DC1F00CB0B34 /* LaunchScreen.storyboard */, - 5028B5391B87DC1F00CB0B34 /* Info.plist */, - ); - path = Stopwatch; - sourceTree = ""; - }; - 5028B5411B87DC1F00CB0B34 /* StopwatchTests */ = { - isa = PBXGroup; - children = ( - 5028B5421B87DC1F00CB0B34 /* StopwatchTests.swift */, - 5028B5441B87DC1F00CB0B34 /* Info.plist */, - ); - path = StopwatchTests; - sourceTree = ""; - }; - 5028B54C1B87DC2000CB0B34 /* StopwatchUITests */ = { - isa = PBXGroup; - children = ( - 5028B54D1B87DC2000CB0B34 /* StopwatchUITests.swift */, - 5028B54F1B87DC2000CB0B34 /* Info.plist */, - ); - path = StopwatchUITests; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 5028B5291B87DC1F00CB0B34 /* Stopwatch */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5028B5521B87DC2000CB0B34 /* Build configuration list for PBXNativeTarget "Stopwatch" */; - buildPhases = ( - 5028B5261B87DC1F00CB0B34 /* Sources */, - 5028B5271B87DC1F00CB0B34 /* Frameworks */, - 5028B5281B87DC1F00CB0B34 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Stopwatch; - productName = Stopwatch; - productReference = 5028B52A1B87DC1F00CB0B34 /* Stopwatch.app */; - productType = "com.apple.product-type.application"; - }; - 5028B53D1B87DC1F00CB0B34 /* StopwatchTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5028B5551B87DC2000CB0B34 /* Build configuration list for PBXNativeTarget "StopwatchTests" */; - buildPhases = ( - 5028B53A1B87DC1F00CB0B34 /* Sources */, - 5028B53B1B87DC1F00CB0B34 /* Frameworks */, - 5028B53C1B87DC1F00CB0B34 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 5028B5401B87DC1F00CB0B34 /* PBXTargetDependency */, - ); - name = StopwatchTests; - productName = StopwatchTests; - productReference = 5028B53E1B87DC1F00CB0B34 /* StopwatchTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 5028B5481B87DC2000CB0B34 /* StopwatchUITests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5028B5581B87DC2000CB0B34 /* Build configuration list for PBXNativeTarget "StopwatchUITests" */; - buildPhases = ( - 5028B5451B87DC2000CB0B34 /* Sources */, - 5028B5461B87DC2000CB0B34 /* Frameworks */, - 5028B5471B87DC2000CB0B34 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 5028B54B1B87DC2000CB0B34 /* PBXTargetDependency */, - ); - name = StopwatchUITests; - productName = StopwatchUITests; - productReference = 5028B5491B87DC2000CB0B34 /* StopwatchUITests.xctest */; - productType = "com.apple.product-type.bundle.ui-testing"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 5028B5221B87DC1F00CB0B34 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0700; - LastUpgradeCheck = 0700; - ORGANIZATIONNAME = "Jovanny Espinal"; - TargetAttributes = { - 5028B5291B87DC1F00CB0B34 = { - CreatedOnToolsVersion = 7.0; - DevelopmentTeam = B4G65K7YME; - }; - 5028B53D1B87DC1F00CB0B34 = { - CreatedOnToolsVersion = 7.0; - DevelopmentTeam = B4G65K7YME; - TestTargetID = 5028B5291B87DC1F00CB0B34; - }; - 5028B5481B87DC2000CB0B34 = { - CreatedOnToolsVersion = 7.0; - DevelopmentTeam = B4G65K7YME; - TestTargetID = 5028B5291B87DC1F00CB0B34; - }; - }; - }; - buildConfigurationList = 5028B5251B87DC1F00CB0B34 /* Build configuration list for PBXProject "Stopwatch" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 5028B5211B87DC1F00CB0B34; - productRefGroup = 5028B52B1B87DC1F00CB0B34 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 5028B5291B87DC1F00CB0B34 /* Stopwatch */, - 5028B53D1B87DC1F00CB0B34 /* StopwatchTests */, - 5028B5481B87DC2000CB0B34 /* StopwatchUITests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 5028B5281B87DC1F00CB0B34 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5028B5381B87DC1F00CB0B34 /* LaunchScreen.storyboard in Resources */, - 5028B5351B87DC1F00CB0B34 /* Assets.xcassets in Resources */, - 5028B5331B87DC1F00CB0B34 /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5028B53C1B87DC1F00CB0B34 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5028B5471B87DC2000CB0B34 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 5028B5261B87DC1F00CB0B34 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5028B5301B87DC1F00CB0B34 /* ViewController.swift in Sources */, - 5028B52E1B87DC1F00CB0B34 /* AppDelegate.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5028B53A1B87DC1F00CB0B34 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5028B5431B87DC1F00CB0B34 /* StopwatchTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5028B5451B87DC2000CB0B34 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5028B54E1B87DC2000CB0B34 /* StopwatchUITests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 5028B5401B87DC1F00CB0B34 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5028B5291B87DC1F00CB0B34 /* Stopwatch */; - targetProxy = 5028B53F1B87DC1F00CB0B34 /* PBXContainerItemProxy */; - }; - 5028B54B1B87DC2000CB0B34 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5028B5291B87DC1F00CB0B34 /* Stopwatch */; - targetProxy = 5028B54A1B87DC2000CB0B34 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 5028B5311B87DC1F00CB0B34 /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 5028B5321B87DC1F00CB0B34 /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 5028B5361B87DC1F00CB0B34 /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 5028B5371B87DC1F00CB0B34 /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 5028B5501B87DC2000CB0B34 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - 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 = 9.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 5028B5511B87DC2000CB0B34 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "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 = gnu99; - 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 = 9.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 5028B5531B87DC2000CB0B34 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - INFOPLIST_FILE = Stopwatch/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = jovannyespinal.Stopwatch; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 5028B5541B87DC2000CB0B34 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - INFOPLIST_FILE = Stopwatch/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = jovannyespinal.Stopwatch; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; - 5028B5561B87DC2000CB0B34 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - INFOPLIST_FILE = StopwatchTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = jovannyespinal.StopwatchTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Stopwatch.app/Stopwatch"; - }; - name = Debug; - }; - 5028B5571B87DC2000CB0B34 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - INFOPLIST_FILE = StopwatchTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = jovannyespinal.StopwatchTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Stopwatch.app/Stopwatch"; - }; - name = Release; - }; - 5028B5591B87DC2000CB0B34 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = StopwatchUITests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = jovannyespinal.StopwatchUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_TARGET_NAME = Stopwatch; - USES_XCTRUNNER = YES; - }; - name = Debug; - }; - 5028B55A1B87DC2000CB0B34 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = StopwatchUITests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = jovannyespinal.StopwatchUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_TARGET_NAME = Stopwatch; - USES_XCTRUNNER = YES; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 5028B5251B87DC1F00CB0B34 /* Build configuration list for PBXProject "Stopwatch" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5028B5501B87DC2000CB0B34 /* Debug */, - 5028B5511B87DC2000CB0B34 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5028B5521B87DC2000CB0B34 /* Build configuration list for PBXNativeTarget "Stopwatch" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5028B5531B87DC2000CB0B34 /* Debug */, - 5028B5541B87DC2000CB0B34 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5028B5551B87DC2000CB0B34 /* Build configuration list for PBXNativeTarget "StopwatchTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5028B5561B87DC2000CB0B34 /* Debug */, - 5028B5571B87DC2000CB0B34 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5028B5581B87DC2000CB0B34 /* Build configuration list for PBXNativeTarget "StopwatchUITests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5028B5591B87DC2000CB0B34 /* Debug */, - 5028B55A1B87DC2000CB0B34 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 5028B5221B87DC1F00CB0B34 /* Project object */; -} diff --git a/Stopwatch/Stopwatch.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Stopwatch/Stopwatch.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index c935585..0000000 --- a/Stopwatch/Stopwatch.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/Stopwatch/Stopwatch/AppDelegate.swift b/Stopwatch/Stopwatch/AppDelegate.swift deleted file mode 100644 index 5871f1d..0000000 --- a/Stopwatch/Stopwatch/AppDelegate.swift +++ /dev/null @@ -1,46 +0,0 @@ -// -// AppDelegate.swift -// Stopwatch -// -// Created by Jovanny Espinal on 8/21/15. -// Copyright © 2015 Jovanny Espinal. All rights reserved. -// - -import UIKit - -@UIApplicationMain -class AppDelegate: UIResponder, UIApplicationDelegate { - - var window: UIWindow? - - - func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { - // Override point for customization after application launch. - return true - } - - func applicationWillResignActive(application: UIApplication) { - // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. - } - - func applicationDidEnterBackground(application: UIApplication) { - // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. - } - - func applicationWillEnterForeground(application: UIApplication) { - // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. - } - - func applicationDidBecomeActive(application: UIApplication) { - // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. - } - - func applicationWillTerminate(application: UIApplication) { - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. - } - - -} - diff --git a/Stopwatch/Stopwatch/Assets.xcassets/AppIcon.appiconset/Contents.json b/Stopwatch/Stopwatch/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 118c98f..0000000 --- a/Stopwatch/Stopwatch/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "images" : [ - { - "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" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Stopwatch/Stopwatch/Assets.xcassets/Contents.json b/Stopwatch/Stopwatch/Assets.xcassets/Contents.json deleted file mode 100644 index da4a164..0000000 --- a/Stopwatch/Stopwatch/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Stopwatch/Stopwatch/Assets.xcassets/lap.imageset/Contents.json b/Stopwatch/Stopwatch/Assets.xcassets/lap.imageset/Contents.json deleted file mode 100644 index cda9aee..0000000 --- a/Stopwatch/Stopwatch/Assets.xcassets/lap.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "lap.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Stopwatch/Stopwatch/Assets.xcassets/lap.imageset/lap.png b/Stopwatch/Stopwatch/Assets.xcassets/lap.imageset/lap.png deleted file mode 100644 index 7263253b32a28de70f5d2080c3990d476f36a597..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2397 zcmbVOc|25m8$T0CWT_O=GDb;hR(wF(m##~z zB3f?Zl5z{xT%lW3TD@1VYiY5xNbgbUegEil|9H>mbI$L1p5OC*_UH3C8U6xK6Qc!2 z005Zqyto0#={5Np8X(``fpeb7VXbx#QwKtkYK;&E0k#AZfoPswCq7ABO!C-9XV zFiPf?0E2-Ef*^51w3s2mxVoU7wM@i-98?R@T6v5@#niGepY1XcdQyzXpg*gqqgj|Q zL51=C(HsZ{(G(mND<%-hXc_}Yq)=%L+A1^&;qe4IoWoPlv=H1;_(`d2B&etL9i50WH1EZsJ<2oDH&cXRN{#^0$whk%uU{I)r;2;Q!nVJIsC`b*dq97%j z!};8Gv;$u#mMJEMD<&KDC2uYW%i=(Z2Mo#4pDWFjeJ2VLnIRF8X$&mrM5kcMbfN?+ zl8}j53Q5EuPze+XQ51>!ikJMq6~rS!;U~xCf5vA@gv{h5`E3~x=G!`f3S@_1WLa=| z`o;h-J(0&{2Wjv37p8axORbuII^r6FD=6QtBh4_%uPu%Ve^g~#`*1VgA!2q%%C31m z_Nph>!wkj3(knaV|Kx{dxvNXd3);Mc6xF%;*TXDmdZ3fez~EBnosYeThhDLyp{;up z6`rkiO&^k$Z$K zB<^J0TD)njDzS^!HP+31Ivof6(3-q|Kx$bPx_Ug3)4zCh-srMX3VzxR5d=b!GrIn* zQcsBcqzd{aVrIUdICIIXwlPEvDn;jiT>ol7#J3Mg*rg}dT`z@p zISwqGBR{=|ww<gob`TTdyWbF+TbIZ3JX=V@1u=07PN zKf3YEhNCpcl@^~yo?J;nSy=dz-KrJ2I6cq6noT9B*FN^lcfoGe3)e4=f1z*h*v=i; zh>f=rTuK6RmWSu9glzfU;M1CkqP*hhh=^g;I-72r@lV4=K=dH?@#h~4feut0za!wjMr1xaz#Jfk^^oD%}dpZJj2F16y*M^L@0d>EE z#;jaMtWk=oS%=?oK^xTFJ=|C&_Rg`I`O~SU%Rhu1+xA;t|A$h~c`x5i6S05!*|!IM z&+_>z-LoD?&CuN^ZrX?%@oocD_if)7|Dd}pXi(YE+EWsbAi)*0!G z$+H;l1M?%}`>NbC)kFC3nw$+rR`_t#>tpfL zqj?W}w}PU7{EuEr^mzx;j+nqqOZ$?9lS=cMM^|eErkh?!y0&bYz;BC1s>j2fuZPQm@Bh`|{AWf*P^8$Vaf|tq#PR0+GM`lrZ(h`I9?sF< zA@I}aN6Z?tb#=AL+MBz&{+WmEy<%?ZwxWg8i<~g*kGJN)A@f=5!cH{wlhcMv^y2rN-4EX$qBOJX;C4mX2H@(}Yn<$~+d!afGlICA@blPf{ZDCFIAY+}?ZQaJKFaJtt!RBDVjjo)YP76T=VX6+Tp> z9mXE1gd;4wcMh`*vVawDJc&5(;BJdq&9lto`qBcd{L>@*L&!CrvsaH?U17L<)qOz~ zAWY9HN_f6PU%LK$e6uNG#Sg631ptD~D93BYhKZJy5e}riPq|zh z{@A%21OBELIVZDi`eM8kE$6LyaNwD&!lf6}n)W4Crkb>P26pBoRcDyAG(AU%hHQR| or}~=hyL}hwJ(rsFCzdw=L1xC{nTz_)O#blj+y&f-*Z=?k diff --git a/Stopwatch/Stopwatch/Assets.xcassets/reset.imageset/Contents.json b/Stopwatch/Stopwatch/Assets.xcassets/reset.imageset/Contents.json deleted file mode 100644 index 6f4703b..0000000 --- a/Stopwatch/Stopwatch/Assets.xcassets/reset.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "reset.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Stopwatch/Stopwatch/Assets.xcassets/reset.imageset/reset.png b/Stopwatch/Stopwatch/Assets.xcassets/reset.imageset/reset.png deleted file mode 100644 index 2ab89cc34509db8d3d053d9cfc745ad97c4af338..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2905 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 LKJ;qW9ch07UBWTF diff --git a/Stopwatch/Stopwatch/Assets.xcassets/stop.imageset/Contents.json b/Stopwatch/Stopwatch/Assets.xcassets/stop.imageset/Contents.json deleted file mode 100644 index 67472ec..0000000 --- a/Stopwatch/Stopwatch/Assets.xcassets/stop.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "stop.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Stopwatch/Stopwatch/Assets.xcassets/stop.imageset/stop.png b/Stopwatch/Stopwatch/Assets.xcassets/stop.imageset/stop.png deleted file mode 100644 index 01f6ac408d8dc54ca2e7e314c55baf3d3f6f1b56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2452 zcmbVOdpMM78-GWLLHKkK(rZjs%baJ7nNS*sCI-n_e9hq<#+XAh6UMO>(LqZkL{cg& z+AXzx*@~njhfyN6Hf$3)7p<~v?Wpv9e{}61-+Nu}`#ksa+`s$&-KXn%_xpIc>%mRn z008LGx48JK)-4OKmZs|KKVIXmT2{+kgJj!9Tv;qr0s+n(5eow80%io{3o$wJUCodK z04#~)`31>>7@kzNNPuQ8=%C{SVig(y95%*@nQT5J16fc6Pw0r4{G|>7@;Hu&KoSGX z5YwPY-j;X?v_0O-j~&lvQ#go?PM|{^Rb@Z`$(UfAAX+G;#yKKB+NG-Y3&$7)_)$g1 zcSL+56~yoXX(9;(lF)W2HWo(&$rLn>WJjiuZ9%+B#$fF+cq|G_p^^wxEFS#)AXMHY z94^(@#qF~%mE?$sl*zk9EC!`VDT6{9;MPiN##NrGY%z`S}s~} zfuw8+Pb}k!gy4cjCQGzi=7>-+{S<;g%wT*mER=pulqzMIIHnkbLt`-l!9rXgwWTs& z=)W|+sx9@Ciy@3JBo*zJuvPWoS}uZBx%+2F3yLZ>RBs7SRTO5li-^5j010Ju7e|EZ z2F>Ads01>bO{Or(D0?P_f+CXf92AqoA)yFdCY!*qQnB#tch7_xAj@6NCCX;6Vn!Q1uvnsKMSDx9djFH&P@}~lon0w5rA*E(9 z+BF=3Ir3rM2ip5W2ajTly6S*^OZ)*@W-omLOrZ(UuM>5YO-lP&@2O)(uq3(@eZnd> z$JFN72jr~&l=`f>{AM?7+#)5a&C%ByVGEdYL%a{7pWA==DA~cJODv ze>dixT<3mI&`P1+a_<%>BiHc_qS^rcu_9~r;>U8qw;RAmCp?r^gVF2m1>Pgy*VZBp zozUse%udd!pgT7^Mbx{BjWI0%CX~LXR^ACGyj|bg(j8`7vhvyGr}+t8cUyXVbxWL< z-l3e^2PDP7{+QBwVpCh+VyjVJpr|%+P%r;3?^>{CM};`gmedKGt)Z zC-k}!Ub%Pg$gVh9W^@*+6*lxhcG>FZhkZYuHQJxr6cjVq^!<>&nyg*_s;KhRe%|ZiZJk{y`n9k>%q%S_ zO_p`s-%`^xVUexvhBkSaA#M?#MPfaHrA_Ztzf9FEsk-T&&fm3c&!y8i;KZea{`&N^ zbZq^WbSm#+j9PDqL-F)#I9G$dmYaD+L;kPnLy23X;CsSXbl!RHk#!<97zT$u1o{)X zj6fSC@Uk;g+?tFuJQ8ejG91<+sd#=G?(ul=j){+!0X(!^dzfGFejeXsc?v(Qj#}Ds zQDUr>@#MU8sAq6^cr1bccG6?*sp7&={k6-?uyqY!n!)hnAG12go(T#R^*NRWt6Exo zZL)4j4)3?#6ox#qzP{A`g7FZ{+JC>%(#;mLo@2e&oYu*w8n2(fk$5e+b!J>+Z*XZ3 zL;eb!W{n0ERGkAN=~R19tFG18gQuM}FUvz-^*cW&PCk2aJ35-Pdq@#+Vz8}nKcYTNG+E1uzfkUlX>Tz~E4&r|>0Y1p4FuN+<)m9Eue zU31Qhlua)EY01WYPQ>hjsQyXJM&Ho6w&7B}0ODx{3m1?w7Ie*P&WJi3oTB~IuLel_ zumbbWc1qof0HkGEe4k`4S37z&1i9v|T)7?{K6C3r!C3{e5*cx1`Wvsb`o2G-{jzfE zjQ9q`0cmrDg<3;$Wto#{?kz{lO+ANVnubd8`D8WqJ8?Ud{%vB-R$YUbk*s**4(rbG z0Ak3tMz0%m{e}W16p;>CG@4gD+RCnO-z_g##Q}K!f*#tQeQmWXD_s++ybmV;?e-X( z8Xc_!hl^n^3l0uAJckmu>4K;;jduy;_qptxyf%rZg*43eKK@r@BXsJ~e(1o;t=0(x z23@ZXc!0c6{JELxKMUhqbhW50MORTfMzcjf!9_Zcl?A3c@2;LN2SLXBHU?7JXYTI% uUhg>aMc - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Stopwatch/Stopwatch/Base.lproj/Main.storyboard b/Stopwatch/Stopwatch/Base.lproj/Main.storyboard deleted file mode 100644 index ec82769..0000000 --- a/Stopwatch/Stopwatch/Base.lproj/Main.storyboard +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Stopwatch/Stopwatch/Info.plist b/Stopwatch/Stopwatch/Info.plist deleted file mode 100644 index 6905cc6..0000000 --- a/Stopwatch/Stopwatch/Info.plist +++ /dev/null @@ -1,40 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/Stopwatch/Stopwatch/ViewController.swift b/Stopwatch/Stopwatch/ViewController.swift deleted file mode 100644 index a789aa3..0000000 --- a/Stopwatch/Stopwatch/ViewController.swift +++ /dev/null @@ -1,179 +0,0 @@ -// -// ViewController.swift -// Stopwatch -// -// Created by Jovanny Espinal on 8/21/15. -// Copyright © 2015 Jovanny Espinal. All rights reserved. -// - -import UIKit -import QuartzCore - -class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { - - //MARK: Properties - - var timer: CADisplayLink! - var lapTimer: CADisplayLink! - - var startTime : CFAbsoluteTime = 0 - var elapsedTime : CFAbsoluteTime = 0 - var stopwatchString: String = "" - - var lapStartTime : CFAbsoluteTime = 0 - var lapElapsedTime : CFAbsoluteTime = 0 - var lapString: String = "" - - var laps: [String] = [] - var isStopped: Bool = true - var canAddLaps: Bool = false - - var totalTime : CFAbsoluteTime = 0 - - @IBOutlet weak var stopwatchLabel: UILabel! - @IBOutlet weak var lapsTableView: UITableView! - - @IBOutlet weak var startStopButton: UIButton! - @IBOutlet weak var lapsResetButton: UIButton! - - //MARK: Lifecycle methods - - override func viewDidLoad() { - super.viewDidLoad() - - //the stopwatchLabel is set to 00:00.00 - stopwatchLabel.text = "00:00.00" - } - - //MARK: Actions - - @IBAction func startStop(sender: AnyObject) { - - if isStopped == true { //start stopwatch - - //record start time - startTime = CFAbsoluteTimeGetCurrent() - lapStartTime = CFAbsoluteTimeGetCurrent() - - //isStopped is false when the stopwatch is started - isStopped = false - - //Allow for laps to be added to the tableView (refer to the lapsReset method) - canAddLaps = true - - //updateStopwatch method - timer = CADisplayLink(target: self, selector: "updateStopwatch") - lapTimer = CADisplayLink(target: self, selector: "updateLap") - - //Add to run loop - timer.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes) - lapTimer.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes) - - //Update buttons - startStopButton.setImage(UIImage(named: "stop.png"), forState: UIControlState.Normal) - lapsResetButton.setImage(UIImage(named: "lap.png"), forState: UIControlState.Normal) - } - - else { //stop stopwatch - - //isStopped is true when the stopwatch is stopped - isStopped = true - - //prevent laps from being added to tableView (refer to the lapsReset method) - canAddLaps = false - - //invalidate the timers when the stopwatch is stopped - timer.invalidate() - lapTimer.invalidate() - - print("total time: \(totalTime)") - //update buttons - startStopButton.setImage(UIImage(named: "start.png"), forState: .Normal) - lapsResetButton.setImage(UIImage(named: "reset.png"), forState: .Normal) - } - - } - - @IBAction func lapsReset(sender: AnyObject) { - - if canAddLaps == true { //add lap - - lapStartTime = CFAbsoluteTimeGetCurrent() - //add the time since the last lap to the laps array (refer to the updateStopWatch method) - laps.insert(lapString, atIndex: 0) - - //Reset the lap counter and lap string - lapElapsedTime = 0 - lapString = "00:00.00" - - //Refreshes the table view that contains the lap tim - lapsTableView.reloadData() - } - - else { //reset - - //remove all elements in the laps array - laps.removeAll(keepCapacity: false) - - //Refreshes the table view that contains the lap times - lapsTableView.reloadData() - - //change reset button to lap button - lapsResetButton.setImage(UIImage(named: "lap.png"), forState: .Normal) - - lapString = "00:00.00" - lapElapsedTime = 0 - - totalTime = 0 - - //reset the stopwatchString (just the string) back to 0. - stopwatchString = "00:00.00" - stopwatchLabel.text = stopwatchString - } - } - - //MARK: Update methods - func updateStopwatch() { - totalTime += timer.duration - stopwatchString = stringFromTimeInterval(totalTime) - - stopwatchLabel.text = stopwatchString - - } - - func updateLap(){ - lapElapsedTime += lapTimer.duration - lapString = stringFromTimeInterval(lapElapsedTime) - } - - func stringFromTimeInterval(interval: CFTimeInterval) -> String { - let intInterval = Int(interval) - let minutes = (intInterval / 60) % 60 - let seconds = intInterval % 60 - let milliseconds = Int(floor(((interval - floor(interval)) * 100))) - - let minutesString = minutes > 9 ? "\(minutes)" : "0\(minutes)" - let secondsString = seconds > 9 ? "\(seconds)" : "0\(seconds)" - let millisecondsString = milliseconds > 9 ? "\(milliseconds)" : "0\(milliseconds)" - - let timeString = minutesString + ":" + secondsString + "." + millisecondsString - - return timeString - } - - // MARK: TableView methods - - func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { - let cell = UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: "Cell") - cell.backgroundColor = self.view.backgroundColor - cell.textLabel!.text = "Lap \(laps.count - indexPath.row)" - cell.detailTextLabel?.text = laps[indexPath.row] - return cell - } - - func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return laps.count - } -} - - diff --git a/Stopwatch/StopwatchTests/Info.plist b/Stopwatch/StopwatchTests/Info.plist deleted file mode 100644 index ba72822..0000000 --- a/Stopwatch/StopwatchTests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/Stopwatch/StopwatchTests/StopwatchTests.swift b/Stopwatch/StopwatchTests/StopwatchTests.swift deleted file mode 100644 index 711ef04..0000000 --- a/Stopwatch/StopwatchTests/StopwatchTests.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// StopwatchTests.swift -// StopwatchTests -// -// Created by Jovanny Espinal on 8/21/15. -// Copyright © 2015 Jovanny Espinal. All rights reserved. -// - -import XCTest -@testable import Stopwatch - -class StopwatchTests: XCTestCase { - - override func setUp() { - super.setUp() - // Put setup code here. This method is called before the invocation of each test method in the class. - } - - override func tearDown() { - // Put teardown code here. This method is called after the invocation of each test method in the class. - super.tearDown() - } - - func testExample() { - // This is an example of a functional test case. - // Use XCTAssert and related functions to verify your tests produce the correct results. - } - - func testPerformanceExample() { - // This is an example of a performance test case. - self.measureBlock { - // Put the code you want to measure the time of here. - } - } - -} diff --git a/Stopwatch/StopwatchUITests/Info.plist b/Stopwatch/StopwatchUITests/Info.plist deleted file mode 100644 index ba72822..0000000 --- a/Stopwatch/StopwatchUITests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/Stopwatch/StopwatchUITests/StopwatchUITests.swift b/Stopwatch/StopwatchUITests/StopwatchUITests.swift deleted file mode 100644 index 92687ff..0000000 --- a/Stopwatch/StopwatchUITests/StopwatchUITests.swift +++ /dev/null @@ -1,34 +0,0 @@ -// -// StopwatchUITests.swift -// StopwatchUITests -// -// Created by Jovanny Espinal on 8/21/15. -// Copyright © 2015 Jovanny Espinal. All rights reserved. -// - -import XCTest - -class StopwatchUITests: XCTestCase { - - override func setUp() { - super.setUp() - - // Put setup code here. This method is called before the invocation of each test method in the class. - - // In UI tests it is usually best to stop immediately when a failure occurs. - continueAfterFailure = false - // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. - XCUIApplication().launch() - } - - override func tearDown() { - // Put teardown code here. This method is called after the invocation of each test method in the class. - super.tearDown() - } - - func testExample() { - // Use recording to get started writing UI tests. - // Use XCTAssert and related functions to verify your tests produce the correct results. - } - -} diff --git a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo.xcodeproj/project.pbxproj b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo.xcodeproj/project.pbxproj deleted file mode 100644 index 49bf441..0000000 --- a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo.xcodeproj/project.pbxproj +++ /dev/null @@ -1,506 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 69E810551B920D7E0061915A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69E810541B920D7E0061915A /* AppDelegate.swift */; }; - 69E810571B920D7E0061915A /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69E810561B920D7E0061915A /* ViewController.swift */; }; - 69E8105A1B920D7E0061915A /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 69E810581B920D7E0061915A /* Main.storyboard */; }; - 69E8105C1B920D7E0061915A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 69E8105B1B920D7E0061915A /* Assets.xcassets */; }; - 69E8105F1B920D7E0061915A /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 69E8105D1B920D7E0061915A /* LaunchScreen.storyboard */; }; - 69E8106A1B920D7E0061915A /* StringFromTimeIntervalDemoTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69E810691B920D7E0061915A /* StringFromTimeIntervalDemoTests.swift */; }; - 69E810751B920D7E0061915A /* StringFromTimeIntervalDemoUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69E810741B920D7E0061915A /* StringFromTimeIntervalDemoUITests.swift */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 69E810661B920D7E0061915A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 69E810491B920D7E0061915A /* Project object */; - proxyType = 1; - remoteGlobalIDString = 69E810501B920D7E0061915A; - remoteInfo = StringFromTimeIntervalDemo; - }; - 69E810711B920D7E0061915A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 69E810491B920D7E0061915A /* Project object */; - proxyType = 1; - remoteGlobalIDString = 69E810501B920D7E0061915A; - remoteInfo = StringFromTimeIntervalDemo; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 69E810511B920D7E0061915A /* StringFromTimeIntervalDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = StringFromTimeIntervalDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 69E810541B920D7E0061915A /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 69E810561B920D7E0061915A /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - 69E810591B920D7E0061915A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 69E8105B1B920D7E0061915A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 69E8105E1B920D7E0061915A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 69E810601B920D7E0061915A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 69E810651B920D7E0061915A /* StringFromTimeIntervalDemoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = StringFromTimeIntervalDemoTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 69E810691B920D7E0061915A /* StringFromTimeIntervalDemoTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringFromTimeIntervalDemoTests.swift; sourceTree = ""; }; - 69E8106B1B920D7E0061915A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 69E810701B920D7E0061915A /* StringFromTimeIntervalDemoUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = StringFromTimeIntervalDemoUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 69E810741B920D7E0061915A /* StringFromTimeIntervalDemoUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringFromTimeIntervalDemoUITests.swift; sourceTree = ""; }; - 69E810761B920D7E0061915A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 69E8104E1B920D7E0061915A /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 69E810621B920D7E0061915A /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 69E8106D1B920D7E0061915A /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 69E810481B920D7E0061915A = { - isa = PBXGroup; - children = ( - 69E810531B920D7E0061915A /* StringFromTimeIntervalDemo */, - 69E810681B920D7E0061915A /* StringFromTimeIntervalDemoTests */, - 69E810731B920D7E0061915A /* StringFromTimeIntervalDemoUITests */, - 69E810521B920D7E0061915A /* Products */, - ); - sourceTree = ""; - }; - 69E810521B920D7E0061915A /* Products */ = { - isa = PBXGroup; - children = ( - 69E810511B920D7E0061915A /* StringFromTimeIntervalDemo.app */, - 69E810651B920D7E0061915A /* StringFromTimeIntervalDemoTests.xctest */, - 69E810701B920D7E0061915A /* StringFromTimeIntervalDemoUITests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 69E810531B920D7E0061915A /* StringFromTimeIntervalDemo */ = { - isa = PBXGroup; - children = ( - 69E810541B920D7E0061915A /* AppDelegate.swift */, - 69E810561B920D7E0061915A /* ViewController.swift */, - 69E810581B920D7E0061915A /* Main.storyboard */, - 69E8105B1B920D7E0061915A /* Assets.xcassets */, - 69E8105D1B920D7E0061915A /* LaunchScreen.storyboard */, - 69E810601B920D7E0061915A /* Info.plist */, - ); - path = StringFromTimeIntervalDemo; - sourceTree = ""; - }; - 69E810681B920D7E0061915A /* StringFromTimeIntervalDemoTests */ = { - isa = PBXGroup; - children = ( - 69E810691B920D7E0061915A /* StringFromTimeIntervalDemoTests.swift */, - 69E8106B1B920D7E0061915A /* Info.plist */, - ); - path = StringFromTimeIntervalDemoTests; - sourceTree = ""; - }; - 69E810731B920D7E0061915A /* StringFromTimeIntervalDemoUITests */ = { - isa = PBXGroup; - children = ( - 69E810741B920D7E0061915A /* StringFromTimeIntervalDemoUITests.swift */, - 69E810761B920D7E0061915A /* Info.plist */, - ); - path = StringFromTimeIntervalDemoUITests; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 69E810501B920D7E0061915A /* StringFromTimeIntervalDemo */ = { - isa = PBXNativeTarget; - buildConfigurationList = 69E810791B920D7E0061915A /* Build configuration list for PBXNativeTarget "StringFromTimeIntervalDemo" */; - buildPhases = ( - 69E8104D1B920D7E0061915A /* Sources */, - 69E8104E1B920D7E0061915A /* Frameworks */, - 69E8104F1B920D7E0061915A /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = StringFromTimeIntervalDemo; - productName = StringFromTimeIntervalDemo; - productReference = 69E810511B920D7E0061915A /* StringFromTimeIntervalDemo.app */; - productType = "com.apple.product-type.application"; - }; - 69E810641B920D7E0061915A /* StringFromTimeIntervalDemoTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 69E8107C1B920D7E0061915A /* Build configuration list for PBXNativeTarget "StringFromTimeIntervalDemoTests" */; - buildPhases = ( - 69E810611B920D7E0061915A /* Sources */, - 69E810621B920D7E0061915A /* Frameworks */, - 69E810631B920D7E0061915A /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 69E810671B920D7E0061915A /* PBXTargetDependency */, - ); - name = StringFromTimeIntervalDemoTests; - productName = StringFromTimeIntervalDemoTests; - productReference = 69E810651B920D7E0061915A /* StringFromTimeIntervalDemoTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 69E8106F1B920D7E0061915A /* StringFromTimeIntervalDemoUITests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 69E8107F1B920D7E0061915A /* Build configuration list for PBXNativeTarget "StringFromTimeIntervalDemoUITests" */; - buildPhases = ( - 69E8106C1B920D7E0061915A /* Sources */, - 69E8106D1B920D7E0061915A /* Frameworks */, - 69E8106E1B920D7E0061915A /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 69E810721B920D7E0061915A /* PBXTargetDependency */, - ); - name = StringFromTimeIntervalDemoUITests; - productName = StringFromTimeIntervalDemoUITests; - productReference = 69E810701B920D7E0061915A /* StringFromTimeIntervalDemoUITests.xctest */; - productType = "com.apple.product-type.bundle.ui-testing"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 69E810491B920D7E0061915A /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0700; - ORGANIZATIONNAME = dereknetto; - TargetAttributes = { - 69E810501B920D7E0061915A = { - CreatedOnToolsVersion = 7.0; - }; - 69E810641B920D7E0061915A = { - CreatedOnToolsVersion = 7.0; - TestTargetID = 69E810501B920D7E0061915A; - }; - 69E8106F1B920D7E0061915A = { - CreatedOnToolsVersion = 7.0; - TestTargetID = 69E810501B920D7E0061915A; - }; - }; - }; - buildConfigurationList = 69E8104C1B920D7E0061915A /* Build configuration list for PBXProject "StringFromTimeIntervalDemo" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 69E810481B920D7E0061915A; - productRefGroup = 69E810521B920D7E0061915A /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 69E810501B920D7E0061915A /* StringFromTimeIntervalDemo */, - 69E810641B920D7E0061915A /* StringFromTimeIntervalDemoTests */, - 69E8106F1B920D7E0061915A /* StringFromTimeIntervalDemoUITests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 69E8104F1B920D7E0061915A /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 69E8105F1B920D7E0061915A /* LaunchScreen.storyboard in Resources */, - 69E8105C1B920D7E0061915A /* Assets.xcassets in Resources */, - 69E8105A1B920D7E0061915A /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 69E810631B920D7E0061915A /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 69E8106E1B920D7E0061915A /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 69E8104D1B920D7E0061915A /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 69E810571B920D7E0061915A /* ViewController.swift in Sources */, - 69E810551B920D7E0061915A /* AppDelegate.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 69E810611B920D7E0061915A /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 69E8106A1B920D7E0061915A /* StringFromTimeIntervalDemoTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 69E8106C1B920D7E0061915A /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 69E810751B920D7E0061915A /* StringFromTimeIntervalDemoUITests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 69E810671B920D7E0061915A /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 69E810501B920D7E0061915A /* StringFromTimeIntervalDemo */; - targetProxy = 69E810661B920D7E0061915A /* PBXContainerItemProxy */; - }; - 69E810721B920D7E0061915A /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 69E810501B920D7E0061915A /* StringFromTimeIntervalDemo */; - targetProxy = 69E810711B920D7E0061915A /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 69E810581B920D7E0061915A /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 69E810591B920D7E0061915A /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 69E8105D1B920D7E0061915A /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 69E8105E1B920D7E0061915A /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 69E810771B920D7E0061915A /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - 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 = 9.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 69E810781B920D7E0061915A /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "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 = gnu99; - 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 = 9.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 69E8107A1B920D7E0061915A /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - INFOPLIST_FILE = StringFromTimeIntervalDemo/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = nyc.c4q.Derek316x.StringFromTimeIntervalDemo; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 69E8107B1B920D7E0061915A /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - INFOPLIST_FILE = StringFromTimeIntervalDemo/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = nyc.c4q.Derek316x.StringFromTimeIntervalDemo; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; - 69E8107D1B920D7E0061915A /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - INFOPLIST_FILE = StringFromTimeIntervalDemoTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = nyc.c4q.Derek316x.StringFromTimeIntervalDemoTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/StringFromTimeIntervalDemo.app/StringFromTimeIntervalDemo"; - }; - name = Debug; - }; - 69E8107E1B920D7E0061915A /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - INFOPLIST_FILE = StringFromTimeIntervalDemoTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = nyc.c4q.Derek316x.StringFromTimeIntervalDemoTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/StringFromTimeIntervalDemo.app/StringFromTimeIntervalDemo"; - }; - name = Release; - }; - 69E810801B920D7E0061915A /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = StringFromTimeIntervalDemoUITests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = nyc.c4q.Derek316x.StringFromTimeIntervalDemoUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_TARGET_NAME = StringFromTimeIntervalDemo; - USES_XCTRUNNER = YES; - }; - name = Debug; - }; - 69E810811B920D7E0061915A /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = StringFromTimeIntervalDemoUITests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = nyc.c4q.Derek316x.StringFromTimeIntervalDemoUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_TARGET_NAME = StringFromTimeIntervalDemo; - USES_XCTRUNNER = YES; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 69E8104C1B920D7E0061915A /* Build configuration list for PBXProject "StringFromTimeIntervalDemo" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 69E810771B920D7E0061915A /* Debug */, - 69E810781B920D7E0061915A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 69E810791B920D7E0061915A /* Build configuration list for PBXNativeTarget "StringFromTimeIntervalDemo" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 69E8107A1B920D7E0061915A /* Debug */, - 69E8107B1B920D7E0061915A /* Release */, - ); - defaultConfigurationIsVisible = 0; - }; - 69E8107C1B920D7E0061915A /* Build configuration list for PBXNativeTarget "StringFromTimeIntervalDemoTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 69E8107D1B920D7E0061915A /* Debug */, - 69E8107E1B920D7E0061915A /* Release */, - ); - defaultConfigurationIsVisible = 0; - }; - 69E8107F1B920D7E0061915A /* Build configuration list for PBXNativeTarget "StringFromTimeIntervalDemoUITests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 69E810801B920D7E0061915A /* Debug */, - 69E810811B920D7E0061915A /* Release */, - ); - defaultConfigurationIsVisible = 0; - }; -/* End XCConfigurationList section */ - }; - rootObject = 69E810491B920D7E0061915A /* Project object */; -} diff --git a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index a5c6992..0000000 --- a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/AppDelegate.swift b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/AppDelegate.swift deleted file mode 100644 index e8bc589..0000000 --- a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/AppDelegate.swift +++ /dev/null @@ -1,46 +0,0 @@ -// -// AppDelegate.swift -// StringFromTimeIntervalDemo -// -// Created by Z on 8/29/15. -// Copyright © 2015 dereknetto. All rights reserved. -// - -import UIKit - -@UIApplicationMain -class AppDelegate: UIResponder, UIApplicationDelegate { - - var window: UIWindow? - - - func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { - // Override point for customization after application launch. - return true - } - - func applicationWillResignActive(application: UIApplication) { - // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. - } - - func applicationDidEnterBackground(application: UIApplication) { - // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. - } - - func applicationWillEnterForeground(application: UIApplication) { - // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. - } - - func applicationDidBecomeActive(application: UIApplication) { - // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. - } - - func applicationWillTerminate(application: UIApplication) { - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. - } - - -} - diff --git a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/Assets.xcassets/AppIcon.appiconset/Contents.json b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 36d2c80..0000000 --- a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "images" : [ - { - "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" : "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" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/Base.lproj/LaunchScreen.storyboard b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index 78b9ef6..0000000 --- a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/Base.lproj/Main.storyboard b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/Base.lproj/Main.storyboard deleted file mode 100644 index 50a30a4..0000000 --- a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/Base.lproj/Main.storyboard +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/Info.plist b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/Info.plist deleted file mode 100644 index 40c6215..0000000 --- a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/Info.plist +++ /dev/null @@ -1,47 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/ViewController.swift b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/ViewController.swift deleted file mode 100644 index 21d07c3..0000000 --- a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemo/ViewController.swift +++ /dev/null @@ -1,80 +0,0 @@ -// -// ViewController.swift -// StringFromTimeIntervalDemo -// -// Created by Z on 8/29/15. -// Copyright © 2015 dereknetto. All rights reserved. -// - -import UIKit - -class ViewController: UIViewController { - - @IBOutlet weak var timeLabel: UILabel! - - @IBOutlet weak var timeTextField: UITextField! - - override func viewDidLoad() { - super.viewDidLoad() - // Do any additional setup after loading the view, typically from a nib. - } - - - @IBAction func convertTimeButton(sender: AnyObject) { - if let timeInput = timeTextField.text{ - timeLabel.text = stringFromTimeInterval((timeInput as NSString).doubleValue) - } - } - - func stringFromTimeInterval(interval: CFTimeInterval, withMilliseconds:Bool = true) -> String{ - let intInterval = Int(interval) - - let years = (intInterval / 31556900) - let months = (intInterval / 2629740) % 12 - let days = (intInterval / (3600 * 24)) % 365 - let hours = (intInterval / 3600) % 24 - let minutes = (intInterval / 60) % 60 - let seconds = intInterval % 60 - let milliseconds = Int(floor(((interval - floor(interval)) * 100))) - - let timeUnits = [years, months, days, hours, minutes, seconds, milliseconds] - - var foundFirstNonzero = false - var timeString = "" - - // remove leading 0s - for (idx, unit) in timeUnits.enumerate() { - if unit == 0 && !foundFirstNonzero { - continue - } - foundFirstNonzero = true - let unitString = unit > 9 ? "\(unit)" : "0\(unit)" - - if (withMilliseconds == true){ - if idx == timeUnits.count - 1 { - timeString = timeString + unitString - } - else if (idx == timeUnits.count - 2){ - timeString = timeString + unitString + "." - }else{ - timeString = timeString + unitString + ":" - } - }else{ - if idx == timeUnits.count - 1 { - //do nothing - } - else if (idx == timeUnits.count - 2){ - timeString = timeString + unitString - }else{ - timeString = timeString + unitString + ":" - } - } - - } - - return timeString - } - - -} - diff --git a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemoTests/Info.plist b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemoTests/Info.plist deleted file mode 100644 index ba72822..0000000 --- a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemoTests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemoTests/StringFromTimeIntervalDemoTests.swift b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemoTests/StringFromTimeIntervalDemoTests.swift deleted file mode 100644 index d65ef55..0000000 --- a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemoTests/StringFromTimeIntervalDemoTests.swift +++ /dev/null @@ -1,35 +0,0 @@ -// -// StringFromTimeIntervalDemoTests.swift -// StringFromTimeIntervalDemoTests -// -// Created by Z on 8/29/15. -// Copyright © 2015 dereknetto. All rights reserved. -// - -import XCTest - -class StringFromTimeIntervalDemoTests: XCTestCase { - - override func setUp() { - super.setUp() - // Put setup code here. This method is called before the invocation of each test method in the class. - } - - override func tearDown() { - // Put teardown code here. This method is called after the invocation of each test method in the class. - super.tearDown() - } - - func testExample() { - // This is an example of a functional test case. - // Use XCTAssert and related functions to verify your tests produce the correct results. - } - - func testPerformanceExample() { - // This is an example of a performance test case. - self.measureBlock() { - // Put the code you want to measure the time of here. - } - } - -} diff --git a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemoUITests/Info.plist b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemoUITests/Info.plist deleted file mode 100644 index ba72822..0000000 --- a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemoUITests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemoUITests/StringFromTimeIntervalDemoUITests.swift b/StringFromTimeIntervalDemo/StringFromTimeIntervalDemoUITests/StringFromTimeIntervalDemoUITests.swift deleted file mode 100644 index 63e1acc..0000000 --- a/StringFromTimeIntervalDemo/StringFromTimeIntervalDemoUITests/StringFromTimeIntervalDemoUITests.swift +++ /dev/null @@ -1,35 +0,0 @@ -// -// StringFromTimeIntervalDemoUITests.swift -// StringFromTimeIntervalDemoUITests -// -// Created by Z on 8/29/15. -// Copyright © 2015 dereknetto. All rights reserved. -// - -import Foundation -import XCTest - -class StringFromTimeIntervalDemoUITests: XCTestCase { - - override func setUp() { - super.setUp() - - // Put setup code here. This method is called before the invocation of each test method in the class. - - // In UI tests it is usually best to stop immediately when a failure occurs. - continueAfterFailure = false - // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. - XCUIApplication().launch() - } - - override func tearDown() { - // Put teardown code here. This method is called after the invocation of each test method in the class. - super.tearDown() - } - - func testExample() { - // Use recording to get started writing UI tests. - // Use XCTAssert and related functions to verify your tests produce the correct results. - } - -}