diff --git a/README.md b/README.md index b2d982a..5ffaf52 100644 --- a/README.md +++ b/README.md @@ -7,15 +7,15 @@ Swift Validator is a rule-based validation library for Swift. ## Core Concepts -* ```UITextField``` + ```ValidationRule``` go into ```Validator``` -* ```UITextField``` + ```ValidationError``` come out of ```Validator``` -* ```UITextField``` is registered to ```Validator``` -* ```Validator``` evaluates ```ValidationRules``` sequentially and stops evaluating when a ```ValidationRule``` fails. +* ``UITextField`` + ``ValidationRule`` go into ```Validator`` +* ``ITextField`` + ``ValidationError`` come out of ```Validator`` +* ``UITextField`` is registered to ``Validator`` +* ``Validator`` evaluates ``ValidationRules`` sequentially and stops evaluating when a ``ValidationRule`` fails. * Keys are used to allow field registration in TableViewControllers and complex view hierarchies ## Quick Start -Initialize the ```Validator``` by setting a delegate to a View Controller or other object. +Initialize the ``Validator`` by setting a delegate to a View Controller or other object. ```swift @@ -33,31 +33,22 @@ Register the fields that you want to validate ```swift -var fields:[String] = ["FullName", "Email", "Phone"] +// Validation Rules are evaluated from left to right. +validator.registerField(fullNameTextField, rules: [RequiredRule(), FullNameRule()]) -// Validation Rules are evaluated from left to right. The first rule is ValidationRuleType.Required the second is ValidationRuleType.FullName. -validator.registerFieldByKey(fields[0], textField:nameTextField, rules: [.Required, .FullName]) -validator.registerFieldByKey(fields[1], textField:emailTextField, rules: [.Required, .Email]) -validator.registerFieldByKe(fields[2], textField:phoneTextField, rules: [.Required, .PhoneNumber]) +// You can pass in error labels with your rules + +validator.registerField(emailTextField, errorLabel: emailErrorLabel, rules: [RequiredRule(), EmailRule()]) + +// You can validate against other fields +validator.registerField(emailConfirmTextField, errorLabel: emailConfirmErrorLabel, rules: [RequiredRule(), EmailRule(), ConfirmationRule(confirmField: emailTextField)]) + +// You can now pass in regex and length parameters through overloaded contructors +validator.registerField(phoneNumberTextField, errorLabel: phoneNumberErrorLabel, rules: [RequiredRule(), MinLengthRule(length: 9)]) +validator.registerField(zipcodeTextField, errorLabel: zipcodeErrorLabel, rules: [RequiredRule(), ZipCodeRule()]) ``` -Validate Individual Field - -```swift - -validator.validateFieldByKey(fields[0], delegate:self) - -// ValidationFieldDelegate methods -func validationFieldSuccess(key:String, validField:UITextField){ - validField.backgroundColor = UIColor.greenColor() -} - -func validationFieldFailure(key:String, error:ValidationError){ - println(error.error.description) -} - -``` Validate All Fields @@ -104,109 +95,11 @@ class SSNValidation: Validation { } -``` - -Add the ```ValidationRuleType.SocialSecurity``` - -```swift - -enum ValidationRuleType { - case Required, - Email, - Password, - MinLength, - MaxLength, - ZipCode, - PhoneNumber, - FullName, - SocialSecurity // Added to the ValidationRuleTypes -} - -``` - -Add the ```ValidationErrorType.SocialSecurity``` and ```description()``` - -```swift - -enum ValidationErrorType { - case Required, - Email, - Password, - MinLength, - MaxLength, - ZipCode, - PhoneNumber, - FullName, - SocialSecurity, // Added to the ValidationErrorTypes - NoError - - func description() -> String { - switch self { - case .Required: - return "Required field" - case .Email: - return "Must be a valid email" - case .MaxLength: - return "This field should be less than" - case .ZipCode: - return "5 digit zipcode" - case .PhoneNumber: - return "10 digit phone number" - case .Password: - return "Must be at least 8 characters" - case .FullName: - return "Provide a first & last name" - // Adding the desired error message - case .SocialSecurity: - return "SSN is XXX-XX-XXXX" - default: - return "" - } - } - -} - -``` -Register the ```SSNValidation``` with the ```ValidationFactory``` - -```swift - -class ValidationFactory { - class func validationForRule(rule:ValidationRuleType) -> Validation { - switch rule { - case .Required: - return RequiredValidation() - case .Email: - return EmailValidation() - case .MinLength: - return MinLengthValidation() - case .MaxLength: - return MaxLengthValidation() - case .PhoneNumber: - return PhoneNumberValidation() - case .ZipCode: - return ZipCodeValidation() - case .FullName: - return FullNameValidation() - // Add Validation to allow Factory to create one on the fly for you - case .SocialSecurity: - return SSNValidation() - default: - return RequiredValidation() - } - } -} - -``` Credits ------- Swift Validator is written and maintained by Jeff Potter [@jpotts18](http://twitter.com/jpotts18) and friends. -Currently funded and maintained by [RingSeven](http://ringseven.com) - -![RingSeven](https://avatars1.githubusercontent.com/u/8309133?v=3&s=200) - ## Contributing 1. [Fork it](https://github.com/jpotts18/swift-validator/fork) diff --git a/Validator.xcodeproj/project.pbxproj b/Validator.xcodeproj/project.pbxproj index c91fb52..15d806a 100644 --- a/Validator.xcodeproj/project.pbxproj +++ b/Validator.xcodeproj/project.pbxproj @@ -7,27 +7,23 @@ objects = { /* Begin PBXBuildFile section */ + 628637261AAA474B00BC8FCF /* MinLengthRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 628637251AAA474B00BC8FCF /* MinLengthRule.swift */; }; + 628637281AAA49E300BC8FCF /* ConfirmRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 628637271AAA49E300BC8FCF /* ConfirmRule.swift */; }; 62D1AE1D1A1E6D4400E4DFF8 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D1AE1C1A1E6D4400E4DFF8 /* AppDelegate.swift */; }; 62D1AE1F1A1E6D4400E4DFF8 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D1AE1E1A1E6D4400E4DFF8 /* ViewController.swift */; }; 62D1AE221A1E6D4400E4DFF8 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 62D1AE201A1E6D4400E4DFF8 /* Main.storyboard */; }; 62D1AE241A1E6D4400E4DFF8 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 62D1AE231A1E6D4400E4DFF8 /* Images.xcassets */; }; 62D1AE271A1E6D4400E4DFF8 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 62D1AE251A1E6D4400E4DFF8 /* LaunchScreen.xib */; }; 62D1AE331A1E6D4500E4DFF8 /* ValidatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D1AE321A1E6D4500E4DFF8 /* ValidatorTests.swift */; }; - 62D1AE3E1A1E6FEF00E4DFF8 /* FullNameValidation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D1AE3D1A1E6FEF00E4DFF8 /* FullNameValidation.swift */; }; - 62D1AE491A1E6FF800E4DFF8 /* EmailValidation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D1AE3F1A1E6FF800E4DFF8 /* EmailValidation.swift */; }; - 62D1AE4A1A1E6FF800E4DFF8 /* MaxLengthValidation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D1AE401A1E6FF800E4DFF8 /* MaxLengthValidation.swift */; }; - 62D1AE4B1A1E6FF800E4DFF8 /* MinLengthValidation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D1AE411A1E6FF800E4DFF8 /* MinLengthValidation.swift */; }; - 62D1AE4C1A1E6FF800E4DFF8 /* PhoneNumberValidation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D1AE421A1E6FF800E4DFF8 /* PhoneNumberValidation.swift */; }; - 62D1AE4D1A1E6FF800E4DFF8 /* RequiredValidation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D1AE431A1E6FF800E4DFF8 /* RequiredValidation.swift */; }; - 62D1AE4E1A1E6FF800E4DFF8 /* Validation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D1AE441A1E6FF800E4DFF8 /* Validation.swift */; }; 62D1AE4F1A1E6FF800E4DFF8 /* ValidationError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D1AE451A1E6FF800E4DFF8 /* ValidationError.swift */; }; - 62D1AE501A1E6FF800E4DFF8 /* ValidationErrorType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D1AE461A1E6FF800E4DFF8 /* ValidationErrorType.swift */; }; - 62D1AE511A1E6FF800E4DFF8 /* ValidationFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D1AE471A1E6FF800E4DFF8 /* ValidationFactory.swift */; }; 62D1AE521A1E6FF800E4DFF8 /* ValidationRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D1AE481A1E6FF800E4DFF8 /* ValidationRule.swift */; }; - 62D1AE571A1E700200E4DFF8 /* ValidationRuleType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D1AE531A1E700200E4DFF8 /* ValidationRuleType.swift */; }; 62D1AE581A1E700200E4DFF8 /* Validator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D1AE541A1E700200E4DFF8 /* Validator.swift */; }; - 62D1AE591A1E700200E4DFF8 /* ZipCodeValidation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D1AE551A1E700200E4DFF8 /* ZipCodeValidation.swift */; }; - 62D1AE5A1A1E700200E4DFF8 /* PasswordValidation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62D1AE561A1E700200E4DFF8 /* PasswordValidation.swift */; }; + 62DC8D651AAA42520095DFA7 /* Rule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62DC8D641AAA42520095DFA7 /* Rule.swift */; }; + 62DC8D681AAA42920095DFA7 /* FullNameRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62DC8D671AAA42920095DFA7 /* FullNameRule.swift */; }; + 62DC8D6C1AAA42CE0095DFA7 /* EmailRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62DC8D691AAA42CE0095DFA7 /* EmailRule.swift */; }; + 62DC8D6D1AAA42CE0095DFA7 /* RequiredRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62DC8D6A1AAA42CE0095DFA7 /* RequiredRule.swift */; }; + 62DC8D6E1AAA42CE0095DFA7 /* PasswordRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62DC8D6B1AAA42CE0095DFA7 /* PasswordRule.swift */; }; + 62DC8D711AAA43110095DFA7 /* ZipCodeRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62DC8D701AAA43110095DFA7 /* ZipCodeRule.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -41,6 +37,8 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 628637251AAA474B00BC8FCF /* MinLengthRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MinLengthRule.swift; sourceTree = ""; }; + 628637271AAA49E300BC8FCF /* ConfirmRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConfirmRule.swift; sourceTree = ""; }; 62D1AE171A1E6D4400E4DFF8 /* Validator.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Validator.app; sourceTree = BUILT_PRODUCTS_DIR; }; 62D1AE1B1A1E6D4400E4DFF8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 62D1AE1C1A1E6D4400E4DFF8 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -51,21 +49,15 @@ 62D1AE2C1A1E6D4500E4DFF8 /* ValidatorTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ValidatorTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 62D1AE311A1E6D4500E4DFF8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 62D1AE321A1E6D4500E4DFF8 /* ValidatorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ValidatorTests.swift; sourceTree = ""; }; - 62D1AE3D1A1E6FEF00E4DFF8 /* FullNameValidation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FullNameValidation.swift; sourceTree = ""; }; - 62D1AE3F1A1E6FF800E4DFF8 /* EmailValidation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EmailValidation.swift; sourceTree = ""; }; - 62D1AE401A1E6FF800E4DFF8 /* MaxLengthValidation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MaxLengthValidation.swift; sourceTree = ""; }; - 62D1AE411A1E6FF800E4DFF8 /* MinLengthValidation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MinLengthValidation.swift; sourceTree = ""; }; - 62D1AE421A1E6FF800E4DFF8 /* PhoneNumberValidation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PhoneNumberValidation.swift; sourceTree = ""; }; - 62D1AE431A1E6FF800E4DFF8 /* RequiredValidation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RequiredValidation.swift; sourceTree = ""; }; - 62D1AE441A1E6FF800E4DFF8 /* Validation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Validation.swift; sourceTree = ""; }; 62D1AE451A1E6FF800E4DFF8 /* ValidationError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValidationError.swift; sourceTree = ""; }; - 62D1AE461A1E6FF800E4DFF8 /* ValidationErrorType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValidationErrorType.swift; sourceTree = ""; }; - 62D1AE471A1E6FF800E4DFF8 /* ValidationFactory.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValidationFactory.swift; sourceTree = ""; }; 62D1AE481A1E6FF800E4DFF8 /* ValidationRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValidationRule.swift; sourceTree = ""; }; - 62D1AE531A1E700200E4DFF8 /* ValidationRuleType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValidationRuleType.swift; sourceTree = ""; }; 62D1AE541A1E700200E4DFF8 /* Validator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Validator.swift; sourceTree = ""; }; - 62D1AE551A1E700200E4DFF8 /* ZipCodeValidation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZipCodeValidation.swift; sourceTree = ""; }; - 62D1AE561A1E700200E4DFF8 /* PasswordValidation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PasswordValidation.swift; sourceTree = ""; }; + 62DC8D641AAA42520095DFA7 /* Rule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Rule.swift; sourceTree = ""; }; + 62DC8D671AAA42920095DFA7 /* FullNameRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FullNameRule.swift; sourceTree = ""; }; + 62DC8D691AAA42CE0095DFA7 /* EmailRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EmailRule.swift; sourceTree = ""; }; + 62DC8D6A1AAA42CE0095DFA7 /* RequiredRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RequiredRule.swift; sourceTree = ""; }; + 62DC8D6B1AAA42CE0095DFA7 /* PasswordRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PasswordRule.swift; sourceTree = ""; }; + 62DC8D701AAA43110095DFA7 /* ZipCodeRule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZipCodeRule.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -89,8 +81,8 @@ 626BE5EE1A9B8EC600FE6D5C /* Swift-Validator */ = { isa = PBXGroup; children = ( + 62DC8D661AAA42700095DFA7 /* Rules */, 62D1AE3C1A1E6FAF00E4DFF8 /* Core */, - 62D1AE5B1A1E701B00E4DFF8 /* Validations */, ); name = "Swift-Validator"; sourceTree = ""; @@ -155,30 +147,26 @@ 62D1AE3C1A1E6FAF00E4DFF8 /* Core */ = { isa = PBXGroup; children = ( - 62D1AE531A1E700200E4DFF8 /* ValidationRuleType.swift */, 62D1AE541A1E700200E4DFF8 /* Validator.swift */, 62D1AE451A1E6FF800E4DFF8 /* ValidationError.swift */, - 62D1AE461A1E6FF800E4DFF8 /* ValidationErrorType.swift */, - 62D1AE471A1E6FF800E4DFF8 /* ValidationFactory.swift */, 62D1AE481A1E6FF800E4DFF8 /* ValidationRule.swift */, - 62D1AE441A1E6FF800E4DFF8 /* Validation.swift */, ); name = Core; sourceTree = ""; }; - 62D1AE5B1A1E701B00E4DFF8 /* Validations */ = { + 62DC8D661AAA42700095DFA7 /* Rules */ = { isa = PBXGroup; children = ( - 62D1AE3D1A1E6FEF00E4DFF8 /* FullNameValidation.swift */, - 62D1AE421A1E6FF800E4DFF8 /* PhoneNumberValidation.swift */, - 62D1AE431A1E6FF800E4DFF8 /* RequiredValidation.swift */, - 62D1AE3F1A1E6FF800E4DFF8 /* EmailValidation.swift */, - 62D1AE411A1E6FF800E4DFF8 /* MinLengthValidation.swift */, - 62D1AE401A1E6FF800E4DFF8 /* MaxLengthValidation.swift */, - 62D1AE561A1E700200E4DFF8 /* PasswordValidation.swift */, - 62D1AE551A1E700200E4DFF8 /* ZipCodeValidation.swift */, + 628637251AAA474B00BC8FCF /* MinLengthRule.swift */, + 62DC8D641AAA42520095DFA7 /* Rule.swift */, + 62DC8D691AAA42CE0095DFA7 /* EmailRule.swift */, + 62DC8D6A1AAA42CE0095DFA7 /* RequiredRule.swift */, + 62DC8D6B1AAA42CE0095DFA7 /* PasswordRule.swift */, + 62DC8D671AAA42920095DFA7 /* FullNameRule.swift */, + 62DC8D701AAA43110095DFA7 /* ZipCodeRule.swift */, + 628637271AAA49E300BC8FCF /* ConfirmRule.swift */, ); - name = Validations; + name = Rules; sourceTree = ""; }; /* End PBXGroup section */ @@ -281,23 +269,19 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 62D1AE4C1A1E6FF800E4DFF8 /* PhoneNumberValidation.swift in Sources */, - 62D1AE5A1A1E700200E4DFF8 /* PasswordValidation.swift in Sources */, + 62DC8D681AAA42920095DFA7 /* FullNameRule.swift in Sources */, 62D1AE4F1A1E6FF800E4DFF8 /* ValidationError.swift in Sources */, - 62D1AE3E1A1E6FEF00E4DFF8 /* FullNameValidation.swift in Sources */, - 62D1AE4B1A1E6FF800E4DFF8 /* MinLengthValidation.swift in Sources */, + 62DC8D6E1AAA42CE0095DFA7 /* PasswordRule.swift in Sources */, + 62DC8D6C1AAA42CE0095DFA7 /* EmailRule.swift in Sources */, + 628637281AAA49E300BC8FCF /* ConfirmRule.swift in Sources */, + 62DC8D651AAA42520095DFA7 /* Rule.swift in Sources */, 62D1AE1F1A1E6D4400E4DFF8 /* ViewController.swift in Sources */, - 62D1AE4E1A1E6FF800E4DFF8 /* Validation.swift in Sources */, + 62DC8D6D1AAA42CE0095DFA7 /* RequiredRule.swift in Sources */, 62D1AE1D1A1E6D4400E4DFF8 /* AppDelegate.swift in Sources */, 62D1AE581A1E700200E4DFF8 /* Validator.swift in Sources */, - 62D1AE501A1E6FF800E4DFF8 /* ValidationErrorType.swift in Sources */, - 62D1AE491A1E6FF800E4DFF8 /* EmailValidation.swift in Sources */, - 62D1AE511A1E6FF800E4DFF8 /* ValidationFactory.swift in Sources */, - 62D1AE591A1E700200E4DFF8 /* ZipCodeValidation.swift in Sources */, - 62D1AE571A1E700200E4DFF8 /* ValidationRuleType.swift in Sources */, + 628637261AAA474B00BC8FCF /* MinLengthRule.swift in Sources */, + 62DC8D711AAA43110095DFA7 /* ZipCodeRule.swift in Sources */, 62D1AE521A1E6FF800E4DFF8 /* ValidationRule.swift in Sources */, - 62D1AE4A1A1E6FF800E4DFF8 /* MaxLengthValidation.swift in Sources */, - 62D1AE4D1A1E6FF800E4DFF8 /* RequiredValidation.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Validator.xcodeproj/project.xcworkspace/xcuserdata/jpotts18.xcuserdatad/UserInterfaceState.xcuserstate b/Validator.xcodeproj/project.xcworkspace/xcuserdata/jpotts18.xcuserdatad/UserInterfaceState.xcuserstate index 22363a0..b631959 100644 Binary files a/Validator.xcodeproj/project.xcworkspace/xcuserdata/jpotts18.xcuserdatad/UserInterfaceState.xcuserstate and b/Validator.xcodeproj/project.xcworkspace/xcuserdata/jpotts18.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/Validator/Base.lproj/Main.storyboard b/Validator/Base.lproj/Main.storyboard index 38e24b4..c6546d7 100644 --- a/Validator/Base.lproj/Main.storyboard +++ b/Validator/Base.lproj/Main.storyboard @@ -1,7 +1,8 @@ - + - + + @@ -23,11 +24,6 @@ - - - - -