├── Modlizer ├── Assets.xcassets │ ├── ic_email.imageset │ │ ├── mailIcon.png │ │ ├── mailIcon@2x.png │ │ ├── mailIcon@3x.png │ │ └── Contents.json │ ├── ic_password.imageset │ │ ├── lockIcon.png │ │ ├── lockIcon@2x.png │ │ ├── lockIcon@3x.png │ │ └── Contents.json │ └── AppIcon.appiconset │ │ └── Contents.json ├── support │ ├── CALayer │ │ └── CALayer+APFunction.swift │ ├── APIntent.swift │ ├── APApplication.swift │ ├── APAlert.swift │ ├── APError.swift │ ├── APColor.swift │ └── APString.swift ├── data │ └── APConstant.swift ├── slices │ ├── APLoginTextFieldController.swift │ ├── APLoginViewController.swift │ ├── APLoginButtonController.swift │ ├── APLoginData.swift │ └── APLoginNetwork.swift ├── Info.plist ├── Base.lproj │ └── LaunchScreen.storyboard ├── AppDelegate.swift └── storyboard │ └── Main.storyboard ├── Podfile ├── Modlizer.xcodeproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcuserdata │ │ └── razvanpaul.xcuserdatad │ │ └── UserInterfaceState.xcuserstate ├── xcuserdata │ └── razvanpaul.xcuserdatad │ │ └── xcschemes │ │ ├── xcschememanagement.plist │ │ └── Modlizer.xcscheme └── project.pbxproj ├── README.md ├── LICENSE └── Podfile.lock /Modlizer/Assets.xcassets/ic_email.imageset/mailIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PaulRBerg/modlizer/HEAD/Modlizer/Assets.xcassets/ic_email.imageset/mailIcon.png -------------------------------------------------------------------------------- /Modlizer/Assets.xcassets/ic_email.imageset/mailIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PaulRBerg/modlizer/HEAD/Modlizer/Assets.xcassets/ic_email.imageset/mailIcon@2x.png -------------------------------------------------------------------------------- /Modlizer/Assets.xcassets/ic_email.imageset/mailIcon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PaulRBerg/modlizer/HEAD/Modlizer/Assets.xcassets/ic_email.imageset/mailIcon@3x.png -------------------------------------------------------------------------------- /Modlizer/Assets.xcassets/ic_password.imageset/lockIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PaulRBerg/modlizer/HEAD/Modlizer/Assets.xcassets/ic_password.imageset/lockIcon.png -------------------------------------------------------------------------------- /Modlizer/Assets.xcassets/ic_password.imageset/lockIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PaulRBerg/modlizer/HEAD/Modlizer/Assets.xcassets/ic_password.imageset/lockIcon@2x.png -------------------------------------------------------------------------------- /Modlizer/Assets.xcassets/ic_password.imageset/lockIcon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PaulRBerg/modlizer/HEAD/Modlizer/Assets.xcassets/ic_password.imageset/lockIcon@3x.png -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | platform :ios, "9.0" 2 | use_frameworks! 3 | 4 | target “Modlizer” do 5 | pod "Firebase/Core" 6 | pod "Firebase/Auth" 7 | pod “CWStatusBarNotification” 8 | pod "MBProgressHUD", "~> 1.0.0" 9 | end -------------------------------------------------------------------------------- /Modlizer.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # modlizer 2 | Modlizer is a simple yet effective way to structure source code when an app is created from scratch. 3 | 4 | The complete presentation: https://medium.com/p/85d621d4e734 👍 5 | 6 | ![Screenshot](http://i.imgur.com/3iRbqoA.png) 7 | -------------------------------------------------------------------------------- /Modlizer.xcodeproj/project.xcworkspace/xcuserdata/razvanpaul.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PaulRBerg/modlizer/HEAD/Modlizer.xcodeproj/project.xcworkspace/xcuserdata/razvanpaul.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /Modlizer/Assets.xcassets/ic_email.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images": [ 3 | { 4 | "idiom": "universal", 5 | "scale": "1x", 6 | "filename": "mailIcon.png" 7 | }, 8 | { 9 | "idiom": "universal", 10 | "scale": "2x", 11 | "filename": "mailIcon@2x.png" 12 | }, 13 | { 14 | "idiom": "universal", 15 | "scale": "3x", 16 | "filename": "mailIcon@3x.png" 17 | } 18 | ], 19 | "info": { 20 | "version": 1, 21 | "author": "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Modlizer/Assets.xcassets/ic_password.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images": [ 3 | { 4 | "idiom": "universal", 5 | "scale": "1x", 6 | "filename": "lockIcon.png" 7 | }, 8 | { 9 | "idiom": "universal", 10 | "scale": "2x", 11 | "filename": "lockIcon@2x.png" 12 | }, 13 | { 14 | "idiom": "universal", 15 | "scale": "3x", 16 | "filename": "lockIcon@3x.png" 17 | } 18 | ], 19 | "info": { 20 | "version": 1, 21 | "author": "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Modlizer/support/CALayer/CALayer+APFunction.swift: -------------------------------------------------------------------------------- 1 | // 2 | // APLoginNetwork.swift 3 | // Modlizer 4 | // 5 | // Created by Paul Berg on 17/07/2017. 6 | // Copyright © 2017 Paul Berg. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension CALayer { 12 | var borderUIColor: UIColor { 13 | set { 14 | self.borderColor = newValue.cgColor 15 | } 16 | 17 | get { 18 | return UIColor(cgColor: self.borderColor!) 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Modlizer/data/APConstant.swift: -------------------------------------------------------------------------------- 1 | // 2 | // APLoginNetwork.swift 3 | // Modlizer 4 | // 5 | // Created by Paul Berg on 17/07/2017. 6 | // Copyright © 2017 Paul Berg. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class APConstant { 12 | 13 | /** 14 | * App related constants. 15 | */ 16 | static let kAPAppName = "Modlizer" 17 | 18 | /** 19 | * Error responses. 20 | */ 21 | static let kAPAppError = NSLocalizedString("Error occurred", comment: "") 22 | static let kAPAppErrorInternet = NSLocalizedString("Network error", comment: "") 23 | } 24 | -------------------------------------------------------------------------------- /Modlizer.xcodeproj/xcuserdata/razvanpaul.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Modlizer.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 530D84671F1CE7A400565155 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /Modlizer/support/APIntent.swift: -------------------------------------------------------------------------------- 1 | // 2 | // APLoginNetwork.swift 3 | // Modlizer 4 | // 5 | // Created by Paul Berg on 17/07/2017. 6 | // Copyright © 2017 Paul Berg. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | /** 12 | * A nice class which handles the intents inside the app. AKA the transitions and navigation between view controllers. 13 | */ 14 | class APIntent { 15 | 16 | /** 17 | * Goes to the page where we listen for changes of the email verification state. 18 | */ 19 | class func gotoEmailVerification(sender: UIViewController) { 20 | // Private method, not available for Modlizer. 21 | } 22 | /** 23 | * Goes to the root view controller of the authenticated user. 24 | */ 25 | class func gotoPlayground(sender: UIViewController) { 26 | // Private method, not available for Modlizer. 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Modlizer/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | } 43 | ], 44 | "info" : { 45 | "version" : 1, 46 | "author" : "xcode" 47 | } 48 | } -------------------------------------------------------------------------------- /Modlizer/support/APApplication.swift: -------------------------------------------------------------------------------- 1 | // 2 | // APLoginNetwork.swift 3 | // Modlizer 4 | // 5 | // Created by Paul Berg on 17/07/2017. 6 | // Copyright © 2017 Paul Berg. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension UIApplication { 12 | 13 | /** 14 | * Returns the top most visible view controller of the app. 15 | */ 16 | class func topViewController(base: UIViewController? = (UIApplication.shared.delegate as! AppDelegate).window?.rootViewController) -> UIViewController? { 17 | if let nav = base as? UINavigationController { 18 | return topViewController(base: nav.visibleViewController) 19 | } 20 | if let tab = base as? UITabBarController { 21 | if let selected = tab.selectedViewController { 22 | return topViewController(base: selected) 23 | } 24 | } 25 | if let presented = base?.presentedViewController { 26 | return topViewController(base: presented) 27 | } 28 | return base 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Modlizer/slices/APLoginTextFieldController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // APLoginTextFieldController.swift 3 | // Modlizer 4 | // 5 | // Created by Paul Berg on 17/07/2017. 6 | // Copyright © 2017 Paul Berg. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension APLoginViewController: UITextFieldDelegate { 12 | 13 | /** 14 | * Append the fully configured text fields to the view controller. 15 | */ 16 | func appendTextField() { 17 | // Private method, not available for Modlizer. 18 | } 19 | 20 | /** 21 | * The text field delegate. 22 | */ 23 | func textFieldShouldReturn(_ textField: UITextField) -> Bool { 24 | if textField == emailTextField { 25 | passwordTextField.becomeFirstResponder() 26 | } 27 | 28 | if textField == passwordTextField { 29 | didTapSignInButton(textField) 30 | } 31 | return true 32 | } 33 | 34 | /** 35 | * Called when the background was tapped. 36 | */ 37 | @IBAction func didTapBackground(_ sender: Any) { 38 | view.endEditing(true) 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Paul Berg 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Modlizer/slices/APLoginViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // APLoginNetwork.swift 3 | // Modlizer 4 | // 5 | // Created by Paul Berg on 17/07/2017. 6 | // Copyright © 2017 Paul Berg. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class APLoginViewController: UIViewController { 12 | 13 | /** 14 | * The views which let the user type the email and the password. 15 | */ 16 | @IBOutlet weak var emailTextField: UITextField! 17 | @IBOutlet weak var passwordTextField: UITextField! 18 | 19 | 20 | /** 21 | * Override 'viewDidLoad'. 22 | */ 23 | override func viewDidLoad() { 24 | super.viewDidLoad() 25 | 26 | /** 27 | * @located in APLoginTextFieldController.swift 28 | */ 29 | appendTextField() 30 | } 31 | 32 | /** 33 | * Override 'viewWillAppear'. 34 | */ 35 | override func viewWillAppear(_ animated: Bool) { 36 | super.viewWillAppear(animated) 37 | } 38 | 39 | 40 | /** 41 | * Override 'didReceiveMemoryWarning'. 42 | */ 43 | override func didReceiveMemoryWarning() { 44 | super.didReceiveMemoryWarning() 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /Modlizer/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UILaunchStoryboardName 24 | LaunchScreen 25 | UIMainStoryboardFile 26 | Main 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /Modlizer/slices/APLoginButtonController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // APLoginNetwork.swift 3 | // Modlizer 4 | // 5 | // Created by Paul Berg on 17/07/2017. 6 | // Copyright © 2017 Paul Berg. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension APLoginViewController { 12 | 13 | /** 14 | * Called when the 'Sign In' (middle) button was tapped. 15 | */ 16 | @IBAction func didTapSignInButton(_ sender: Any) { 17 | view.endEditing(true) 18 | 19 | /** 20 | * We proceed to sign up the user only if all the requirements are met. 21 | */ 22 | if !isDataValid() { 23 | return 24 | } 25 | login() 26 | } 27 | 28 | /** 29 | * Called when the small 'Forgot Password' (to the right of password field) button was tapped. 30 | */ 31 | func didTapForgotPasswordButton(_ sender: Any) { 32 | let storyboard = UIStoryboard(name: APConstant.kAPForgotPasswordStoryboard, bundle: nil) 33 | let forgotPasswordViewController = storyboard.instantiateInitialViewController()! 34 | navigationController!.show(forgotPasswordViewController, sender: self) 35 | } 36 | 37 | /** 38 | * Called when the 'Forgot Password?' (bottom of the page) button was tapped. 39 | */ 40 | @IBAction func didTapForgotPasswordLabel(_ sender: Any) { 41 | didTapForgotPasswordButton(sender) 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /Modlizer/slices/APLoginData.swift: -------------------------------------------------------------------------------- 1 | // 2 | // APLoginNetwork.swift 3 | // Modlizer 4 | // 5 | // Created by Paul Berg on 17/07/2017. 6 | // Copyright © 2017 Paul Berg. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class APLoginData { 12 | var dummy: String? 13 | } 14 | 15 | extension APLoginViewController { 16 | /** 17 | * Checks to see if the entered profile data is valid. 18 | */ 19 | func isDataValid() -> Bool { 20 | /** 21 | * Email requirements. 22 | */ 23 | if !emailTextField.text!.isEmail() { 24 | APAlert.top(NSLocalizedString("Invalid email address", comment: "")) 25 | return false 26 | } 27 | 28 | /** 29 | * Password requirements. 30 | */ 31 | // We do not allow less than 8 characters and more than 100. 32 | if passwordTextField.text!.characters.count < 8 || passwordTextField.text!.characters.count > 100 { 33 | APAlert.top(NSLocalizedString("Password must have between 8 and 100 letters", comment: "")) 34 | return false 35 | } 36 | 37 | // We do not allow spaces at the beginning and at the end of the string. 38 | if passwordTextField.text![0] == " " || passwordTextField.text![passwordTextField.text!.characters.count-1] == " " { 39 | APAlert.top(NSLocalizedString("Password's first and last char cannot be a space", comment: "")) 40 | return false 41 | } 42 | 43 | return true 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /Modlizer/slices/APLoginNetwork.swift: -------------------------------------------------------------------------------- 1 | // 2 | // APLoginNetwork.swift 3 | // Modlizer 4 | // 5 | // Created by Paul Berg on 17/07/2017. 6 | // Copyright © 2017 Paul Berg. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import FirebaseAuth 11 | import MBProgressHUD 12 | 13 | extension APLoginViewController { 14 | 15 | /** 16 | * Simply logins the user using the classic email & password. 17 | */ 18 | func login() { 19 | APAlert.top(NSLocalizedString("Sample app, can't login", comment: "")) 20 | return; 21 | 22 | MBProgressHUD.showAdded(to: self.view, animated: true) 23 | FIRAuth.auth()?.signIn(withEmail: emailTextField.text!, 24 | password: passwordTextField.text!, 25 | completion: { [unowned self] (user, error) in 26 | self.handleResponse(error: error) 27 | }) 28 | } 29 | 30 | /** 31 | * Handles the response of the request made above. We're going to the playground. 32 | */ 33 | fileprivate func handleResponse(error: Error?) { 34 | MBProgressHUD.hide(for: self.view, animated: true) 35 | if error != nil { 36 | APError.credential(error!) 37 | return 38 | } 39 | 40 | /** 41 | * The user is not successfully logged in until the email is verified. 42 | */ 43 | if !FIRAuth.auth()!.currentUser!.isEmailVerified { 44 | APIntent.gotoEmailVerification(sender: self) 45 | return 46 | } 47 | APIntent.gotoPlayground(sender: self) 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /Modlizer/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /Modlizer/support/APAlert.swift: -------------------------------------------------------------------------------- 1 | // 2 | // APLoginNetwork.swift 3 | // Modlizer 4 | // 5 | // Created by Paul Berg on 17/07/2017. 6 | // Copyright © 2017 Paul Berg. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import CWStatusBarNotification 11 | 12 | /** 13 | * A helper to class to usually present alerts throughout the app. 14 | */ 15 | 16 | private var negative = APColor.highlight 17 | private var positive = APColor.green 18 | 19 | class APAlert { 20 | 21 | /** 22 | * Basic highlighted notification which appears in the top of the page. Uses a default value of 3.5 seconds. 23 | * The default color is the `highlight` which is a kind of grena, a darker red. 24 | */ 25 | class func top(_ message: String) { 26 | top(message, color: negative) 27 | } 28 | 29 | class func top(_ message: String, isPositive: Bool) { 30 | top(message, color: isPositive ? positive : negative) 31 | } 32 | 33 | 34 | /** 35 | * Displays a top positive notification. 36 | */ 37 | class func top(_ message: String, color: UIColor) { 38 | let notification = CWStatusBarNotification() 39 | notification.notificationLabelBackgroundColor = color 40 | notification.notificationStyle = .navigationBarNotification 41 | notification.display(withMessage: message, forDuration: 3.5) 42 | } 43 | 44 | 45 | /** 46 | * Displaying an actual alert controller in the center of the top most view controller. The default button is "Ok" and it simply dismisses the alert controller 47 | */ 48 | class func centerAlert(title: String, message: String) { 49 | let alertController = UIAlertController(title: title, 50 | message: message, 51 | preferredStyle: .alert) 52 | alertController.addAction(UIAlertAction(title: "Ok", style: .cancel, handler: nil)) 53 | UIApplication.topViewController()?.present(alertController, animated: true, completion: nil) 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - CWStatusBarNotification (2.3.5) 3 | - Firebase/Auth (3.17.0): 4 | - Firebase/Core 5 | - FirebaseAuth (= 3.1.1) 6 | - Firebase/Core (3.17.0): 7 | - FirebaseAnalytics (= 3.9.0) 8 | - FirebaseCore (= 3.6.0) 9 | - FirebaseAnalytics (3.9.0): 10 | - FirebaseCore (~> 3.6) 11 | - FirebaseInstanceID (~> 1.0) 12 | - GoogleToolboxForMac/NSData+zlib (~> 2.1) 13 | - FirebaseAuth (3.1.1): 14 | - FirebaseAnalytics (~> 3.7) 15 | - GoogleToolboxForMac/NSDictionary+URLArguments (~> 2.1) 16 | - GTMSessionFetcher/Core (~> 1.1) 17 | - FirebaseCore (3.6.0): 18 | - GoogleToolboxForMac/NSData+zlib (~> 2.1) 19 | - FirebaseInstanceID (1.0.10): 20 | - FirebaseCore (~> 3.6) 21 | - GoogleToolboxForMac/DebugUtils (2.1.1): 22 | - GoogleToolboxForMac/Defines (= 2.1.1) 23 | - GoogleToolboxForMac/Defines (2.1.1) 24 | - GoogleToolboxForMac/NSData+zlib (2.1.1): 25 | - GoogleToolboxForMac/Defines (= 2.1.1) 26 | - GoogleToolboxForMac/NSDictionary+URLArguments (2.1.1): 27 | - GoogleToolboxForMac/DebugUtils (= 2.1.1) 28 | - GoogleToolboxForMac/Defines (= 2.1.1) 29 | - GoogleToolboxForMac/NSString+URLArguments (= 2.1.1) 30 | - GoogleToolboxForMac/NSString+URLArguments (2.1.1) 31 | - GTMSessionFetcher/Core (1.1.9) 32 | - MBProgressHUD (1.0.0) 33 | 34 | DEPENDENCIES: 35 | - CWStatusBarNotification 36 | - Firebase/Auth 37 | - Firebase/Core 38 | - MBProgressHUD (~> 1.0.0) 39 | 40 | SPEC CHECKSUMS: 41 | CWStatusBarNotification: 3d2738b25c3207f60cc50201388d3c96182545ff 42 | Firebase: 4b66b5b59c43edac745b87f0c87e42cdd0279c13 43 | FirebaseAnalytics: e5fe8486efc01bec33f6bf82e2fa9fce4b124052 44 | FirebaseAuth: cc8a1824170adbd351edb7f994490a3fb5c18be6 45 | FirebaseCore: 9691ee2ade70c098d7cf92440f4303f16d83ca75 46 | FirebaseInstanceID: b9eedd6846fb5e1f0f7279e1deaa7a7e4cf8392e 47 | GoogleToolboxForMac: 8e329f1b599f2512c6b10676d45736bcc2cbbeb0 48 | GTMSessionFetcher: 5c046c76a1f859bc9c187e918f18e4fc7bb57b5e 49 | MBProgressHUD: 4890f671c94e8a0f3cf959aa731e9de2f036d71a 50 | 51 | PODFILE CHECKSUM: 8b5b952cf9b6c06d1f853e05c35a0e852606019e 52 | 53 | COCOAPODS: 1.2.1.beta.1 54 | -------------------------------------------------------------------------------- /Modlizer/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // Modlizer 4 | // 5 | // Created by Paul Berg on 17/07/2017. 6 | // Copyright © 2017 Paul Berg. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | 17 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 18 | // Override point for customization after application launch. 19 | return true 20 | } 21 | 22 | func applicationWillResignActive(_ application: UIApplication) { 23 | // 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. 24 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. 25 | } 26 | 27 | func applicationDidEnterBackground(_ application: UIApplication) { 28 | // 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. 29 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 30 | } 31 | 32 | func applicationWillEnterForeground(_ application: UIApplication) { 33 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 34 | } 35 | 36 | func applicationDidBecomeActive(_ application: UIApplication) { 37 | // 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. 38 | } 39 | 40 | func applicationWillTerminate(_ application: UIApplication) { 41 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 42 | } 43 | 44 | 45 | } 46 | 47 | -------------------------------------------------------------------------------- /Modlizer/support/APError.swift: -------------------------------------------------------------------------------- 1 | // 2 | // APLoginNetwork.swift 3 | // Modlizer 4 | // 5 | // Created by Paul Berg on 17/07/2017. 6 | // Copyright © 2017 Paul Berg. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import FirebaseAuth 11 | import MBProgressHUD 12 | 13 | /** 14 | * A helper class which handles some common error actions. 15 | */ 16 | class APError { 17 | 18 | /** 19 | * Handles the Firebase credential errors. They are self-explanatory. 20 | */ 21 | class func credential(_ error: Error) { 22 | var message = "" 23 | switch (FIRAuthErrorCode(rawValue: (error._code))!) { 24 | /** 25 | * Login & Sign Up. 26 | */ 27 | case .errorCodeInvalidEmail: 28 | message = NSLocalizedString("This email format appears to be invalid", comment: "") 29 | break 30 | case .errorCodeEmailAlreadyInUse: 31 | message = NSLocalizedString("This email appears to be already in use", comment: "") 32 | break 33 | case .errorCodeWrongPassword: 34 | message = NSLocalizedString("Incorrect password", comment: "") 35 | break 36 | case .errorCodeWeakPassword: 37 | message = NSLocalizedString("Password is not strong enough", comment: "") 38 | break 39 | /** 40 | * Forgot Password. 41 | */ 42 | case .errorCodeUserNotFound: 43 | message = NSLocalizedString("This email doesn’t appear to exist in our system", comment: "") 44 | break 45 | /** 46 | * General 47 | */ 48 | case .errorCodeOperationNotAllowed: 49 | message = NSLocalizedString("Network error", comment: "") 50 | break 51 | case .errorCodeNetworkError: 52 | message = NSLocalizedString("Network error", comment: "") 53 | break 54 | default: 55 | message = NSLocalizedString("Network error", comment: "") 56 | break 57 | } 58 | 59 | APAlert.top(message) 60 | } 61 | } 62 | 63 | 64 | /** 65 | * Helper funcs. 66 | */ 67 | extension Error { 68 | /** 69 | * Bridges to NSError. 70 | */ 71 | var userInfo: [String:AnyObject] { 72 | get { 73 | return (self as NSError).userInfo 74 | } 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /Modlizer.xcodeproj/xcuserdata/razvanpaul.xcuserdatad/xcschemes/Modlizer.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /Modlizer/support/APColor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // APLoginNetwork.swift 3 | // Modlizer 4 | // 5 | // Created by Paul Berg on 17/07/2017. 6 | // Copyright © 2017 Paul Berg. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | /** 12 | * A class which simplifies the process of retrieving some colors throughout the app. 13 | */ 14 | class APColor { 15 | /** 16 | * The most common background color used. 17 | */ 18 | class var background: UIColor { 19 | get { 20 | return UIColor(red: 238/255.0, green: 240/255.0, blue: 246/255.0, alpha: 1.0) 21 | } 22 | } 23 | 24 | /** 25 | * The most common dark blue color used throughout the app. 26 | */ 27 | class var darkBlue: UIColor { 28 | get { 29 | return UIColor(red: 0/255.0, green: 38/255.0, blue: 99/255.0, alpha: 1.0) 30 | } 31 | } 32 | 33 | /** 34 | * The most common gray collor used throughout the app. 35 | */ 36 | class var gray: UIColor { 37 | get { 38 | return UIColor(red: 1/255.0, green: 26/255.0, blue: 81/255.0, alpha: 1.0) 39 | } 40 | } 41 | 42 | /** 43 | * The most common green color used throughout the app. 44 | */ 45 | class var green: UIColor { 46 | get { 47 | return UIColor(red: 107/255.0, green: 209/255.0, blue: 107/255.0, alpha: 1.0) 48 | } 49 | } 50 | 51 | /** 52 | * A nice highlight color used to show errors (mostly, but not only). 53 | */ 54 | class var highlight: UIColor { 55 | get { 56 | return UIColor(red: 180/255.0, green: 70/255.0, blue: 65/255.0, alpha: 1.0) 57 | } 58 | } 59 | 60 | /** 61 | * The most common light green color used throughout the app. 62 | */ 63 | class var lightGreen: UIColor { 64 | get { 65 | return UIColor(red: 158/255.0, green: 245/255.0, blue: 167/255.0, alpha: 1.0) 66 | } 67 | } 68 | 69 | /** 70 | * The main color. 71 | */ 72 | class var main: UIColor { 73 | get { 74 | return UIColor(red: 239/255.0, green: 133/255.0, blue: 51/255.0, alpha: 1.0) 75 | } 76 | } 77 | 78 | /** 79 | * The color to be used on pacing. 80 | */ 81 | class var pacingGreen: UIColor { 82 | get { 83 | return UIColor(red: 92/255.0, green: 180/255.0, blue: 65/255.0, alpha: 1.0) 84 | } 85 | } 86 | 87 | /** 88 | * The color to be used on the underpacing/ overpacing. 89 | */ 90 | class var pacingRed: UIColor { 91 | get { 92 | return UIColor(red: 234/255.0, green: 77/255.0, blue: 78/255.0, alpha: 1.0) 93 | } 94 | } 95 | } 96 | 97 | /** 98 | * Helper funcs. 99 | */ 100 | extension APColor { 101 | 102 | /** 103 | * Converts a hex to a UIColor. 104 | */ 105 | class func parse(hex: String) -> UIColor { 106 | let result = hex.trimmingCharacters(in: CharacterSet.alphanumerics.inverted) 107 | var int = UInt32() 108 | Scanner(string: result).scanHexInt32(&int) 109 | let a, r, g, b: UInt32 110 | switch result.characters.count { 111 | case 3: // RGB (12-bit) 112 | (a, r, g, b) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17) 113 | case 6: // RGB (24-bit) 114 | (a, r, g, b) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF) 115 | case 8: // ARGB (32-bit) 116 | (a, r, g, b) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF) 117 | default: 118 | return .clear 119 | } 120 | return UIColor(red: CGFloat(r) / 255, green: CGFloat(g) / 255, blue: CGFloat(b) / 255, alpha: CGFloat(a) / 255) 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /Modlizer/support/APString.swift: -------------------------------------------------------------------------------- 1 | // 2 | // APLoginNetwork.swift 3 | // Modlizer 4 | // 5 | // Created by Paul Berg on 17/07/2017. 6 | // Copyright © 2017 Paul Berg. All rights reserved. 7 | // 8 | import UIKit 9 | 10 | /** 11 | * Some of the most common strings used throughout the app. This also helps internatiozaling the app. 12 | */ 13 | class APString { 14 | 15 | class var ok: String { 16 | get { 17 | return NSLocalizedString("Ok", comment: "") 18 | } 19 | } 20 | 21 | class var yes: String { 22 | get { 23 | return NSLocalizedString("Yes", comment: "") 24 | } 25 | } 26 | 27 | class var cancel: String { 28 | get { 29 | return NSLocalizedString("Cancel", comment: "") 30 | } 31 | } 32 | 33 | class var oops: String { 34 | get { 35 | return NSLocalizedString("Oops", comment: "") 36 | } 37 | } 38 | 39 | class var emailError: String { 40 | get { 41 | return NSLocalizedString("Please connect an email account to Apple’s native Mail app.", comment: "") 42 | } 43 | } 44 | 45 | class var facebookError: String { 46 | get { 47 | return NSLocalizedString("Unfortunately, some Facebook API issue occurred. Please try again.", comment: "") 48 | } 49 | } 50 | 51 | class var networkError: String { 52 | get { 53 | return NSLocalizedString("Unfortunately, some networking issue occurred. Please try again.", comment: "") 54 | } 55 | } 56 | } 57 | 58 | /** 59 | * Helper extension for the general purposes strings. 60 | */ 61 | extension String { 62 | subscript (index: Int) -> Character { 63 | let charIndex = self.index(self.startIndex, offsetBy: index) 64 | return self[charIndex] 65 | } 66 | } 67 | 68 | /** 69 | * Helper extension for the Modlizer formatting system. 70 | */ 71 | extension String { 72 | 73 | /** 74 | * Tells if the string is valid (no 0 length, no only white spaces). 75 | */ 76 | func isValid() -> Bool { 77 | if characters.count == 0 { 78 | return false 79 | } 80 | 81 | if self.trimmingCharacters(in: NSCharacterSet.whitespacesAndNewlines) == "" { 82 | return false 83 | } 84 | 85 | return true 86 | } 87 | 88 | /** 89 | * Cleans all the undesired characters, such as national specific ones. 90 | */ 91 | func removeSpecialCharacters() -> String { 92 | let cleanString = folding(options: .diacriticInsensitive, locale: .current) 93 | let okayCharacters : Set = 94 | Set("abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLKMNOPQRSTUVWXYZ1234567890+-*=(),.:!_".characters) 95 | return String(cleanString.characters.filter {okayCharacters.contains($0) }) 96 | } 97 | } 98 | 99 | extension String { 100 | /** 101 | * Tells if one string is formatted as a desired Modlier email address. 102 | */ 103 | mutating func isEmail() -> Bool { 104 | if !isValid() { 105 | return false 106 | } 107 | 108 | /** 109 | * An email must have a "@" and a dot. Also, it is not allowed to have any spaces or double dots: "..". 110 | */ 111 | if range(of: "@") == nil || range(of: ".") == nil || range(of: "..") != nil { 112 | return false 113 | } 114 | 115 | let parts = components(separatedBy: "@") 116 | 117 | /** 118 | * Verify the local name firstly. 119 | */ 120 | let local = parts[0] 121 | if local.characters.count > 64 { 122 | return false 123 | } 124 | 125 | /** 126 | Then, take a look at the domain. 127 | */ 128 | let domain = parts[1] 129 | if domain.characters.count > 255 { 130 | return false 131 | } 132 | if domain.range(of: ".") == nil { 133 | return false 134 | } 135 | 136 | self = lowercased() 137 | return true 138 | } 139 | 140 | /** 141 | * Tells if one string is formatted as a desired Modlizer password. 142 | */ 143 | func isPassword() -> Bool { 144 | // We do not allow less than 8 characters and more than 100. 145 | if characters.count < 8 || characters.count > 100 { 146 | return false 147 | } 148 | 149 | // We do not allow spaces at the beginning and at the end of the string. 150 | if self[0] == " " || self[characters.count-1] == " " { 151 | return false 152 | } 153 | return true 154 | } 155 | } 156 | 157 | 158 | extension String { 159 | /** 160 | * Transforms the string into a formatted big number (eg: 10,000,000). 161 | */ 162 | func formatNumber() -> String { 163 | 164 | /** 165 | * Creating the number formatter. 166 | */ 167 | let formatter = NumberFormatter() 168 | formatter.numberStyle = .decimal 169 | formatter.locale = Locale.current 170 | formatter.maximumFractionDigits = 0 171 | 172 | /** 173 | If the app does not have a grouping separator, we stop here. This is extremely odd. 174 | */ 175 | guard let groupingSeparator = formatter.groupingSeparator else { 176 | return self 177 | } 178 | 179 | /** 180 | * If everything is good, we return the result. 181 | */ 182 | let textWithoutGroupingSeparator = replacingOccurrences(of: groupingSeparator, with: "") 183 | if let numberWithoutGroupingSeparator = formatter.number(from: textWithoutGroupingSeparator) { 184 | if let formattedText = formatter.string(from: numberWithoutGroupingSeparator) { 185 | return formattedText 186 | } 187 | } 188 | 189 | return self 190 | } 191 | 192 | /** 193 | * Converts a formatted big number (eg: 10,000,000) to a float value. Usually, we need this function to retrieve the number value of one text field's `text` property. 194 | */ 195 | func simpleNumber() -> Float { 196 | var formattedString = self 197 | /** 198 | * Basically, because of the number formatting, we want to obtain the float value of the number again by replacing the separator character and the spaces with "". 199 | */ 200 | let formatter = NumberFormatter() 201 | formatter.numberStyle = .decimal 202 | formatter.locale = Locale.current 203 | formatter.maximumFractionDigits = 0 204 | /** 205 | * If the app does not have a grouping separator, we stop here. This is extremely odd. 206 | */ 207 | guard let groupingSeparator = formatter.groupingSeparator else { 208 | return 0 209 | } 210 | formattedString = formattedString.replacingOccurrences(of: groupingSeparator, with: "") 211 | formattedString = formattedString.replacingOccurrences(of: " ", with: "") 212 | 213 | /** 214 | * If we can't convert the budget and the fee to floats, we obviously stop here. 215 | */ 216 | guard let floatValue = Float(formattedString) else { 217 | return 0 218 | } 219 | return floatValue 220 | } 221 | } 222 | 223 | 224 | extension String { 225 | /** 226 | * Simply generates some `very` random strings. 227 | */ 228 | static func random() -> String { 229 | return self.random(length: 20) 230 | } 231 | 232 | static func random(length: Int) -> String { 233 | let letters : NSString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" 234 | let len = UInt32(letters.length) 235 | 236 | var randomString = "" 237 | 238 | for _ in 0 ..< length { 239 | let rand = arc4random_uniform(len) 240 | var nextChar = letters.character(at: Int(rand)) 241 | randomString += NSString(characters: &nextChar, length: 1) as String 242 | } 243 | 244 | return randomString 245 | } 246 | } 247 | -------------------------------------------------------------------------------- /Modlizer.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 0E0CB2E4FDA6200DD4FE01FB /* Pods_Modlizer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8E59733BB023E3D26FD1E036 /* Pods_Modlizer.framework */; }; 11 | 530D846C1F1CE7A400565155 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 530D846B1F1CE7A400565155 /* AppDelegate.swift */; }; 12 | 530D84731F1CE7A400565155 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 530D84721F1CE7A400565155 /* Assets.xcassets */; }; 13 | 530D84761F1CE7A400565155 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 530D84741F1CE7A400565155 /* LaunchScreen.storyboard */; }; 14 | 530D848D1F1CE82C00565155 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 530D84861F1CE82C00565155 /* Main.storyboard */; }; 15 | 53290DD31F1CEA1F003B7ADA /* APIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53290DD11F1CEA1F003B7ADA /* APIntent.swift */; }; 16 | 53290DD41F1CEA1F003B7ADA /* APString.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53290DD21F1CEA1F003B7ADA /* APString.swift */; }; 17 | 53290DDB1F1CEA2B003B7ADA /* APLoginButtonController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53290DD61F1CEA2B003B7ADA /* APLoginButtonController.swift */; }; 18 | 53290DDC1F1CEA2B003B7ADA /* APLoginData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53290DD71F1CEA2B003B7ADA /* APLoginData.swift */; }; 19 | 53290DDD1F1CEA2B003B7ADA /* APLoginNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53290DD81F1CEA2B003B7ADA /* APLoginNetwork.swift */; }; 20 | 53290DDE1F1CEA2B003B7ADA /* APLoginTextFieldController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53290DD91F1CEA2B003B7ADA /* APLoginTextFieldController.swift */; }; 21 | 53290DDF1F1CEA2B003B7ADA /* APLoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53290DDA1F1CEA2B003B7ADA /* APLoginViewController.swift */; }; 22 | 53290DE11F1CEA60003B7ADA /* APError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53290DE01F1CEA60003B7ADA /* APError.swift */; }; 23 | 53290DE41F1CEA7C003B7ADA /* APConstant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53290DE31F1CEA7C003B7ADA /* APConstant.swift */; }; 24 | 53290DE61F1CEAD2003B7ADA /* APAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53290DE51F1CEAD2003B7ADA /* APAlert.swift */; }; 25 | 53290DE81F1CEB4F003B7ADA /* APColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53290DE71F1CEB4F003B7ADA /* APColor.swift */; }; 26 | 53290DEA1F1CEBBA003B7ADA /* APApplication.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53290DE91F1CEBBA003B7ADA /* APApplication.swift */; }; 27 | 53290DED1F1CEEF8003B7ADA /* CALayer+APFunction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53290DEC1F1CEEF8003B7ADA /* CALayer+APFunction.swift */; }; 28 | /* End PBXBuildFile section */ 29 | 30 | /* Begin PBXFileReference section */ 31 | 107F1222A449DF9FC786CD6D /* Pods-Modlizer.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Modlizer.release.xcconfig"; path = "Pods/Target Support Files/Pods-Modlizer/Pods-Modlizer.release.xcconfig"; sourceTree = ""; }; 32 | 530D84681F1CE7A400565155 /* Modlizer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Modlizer.app; sourceTree = BUILT_PRODUCTS_DIR; }; 33 | 530D846B1F1CE7A400565155 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 34 | 530D84721F1CE7A400565155 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 35 | 530D84751F1CE7A400565155 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 36 | 530D84771F1CE7A400565155 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 37 | 530D84861F1CE82C00565155 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = ""; }; 38 | 53290DD11F1CEA1F003B7ADA /* APIntent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APIntent.swift; sourceTree = ""; }; 39 | 53290DD21F1CEA1F003B7ADA /* APString.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APString.swift; sourceTree = ""; }; 40 | 53290DD61F1CEA2B003B7ADA /* APLoginButtonController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APLoginButtonController.swift; sourceTree = ""; }; 41 | 53290DD71F1CEA2B003B7ADA /* APLoginData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APLoginData.swift; sourceTree = ""; }; 42 | 53290DD81F1CEA2B003B7ADA /* APLoginNetwork.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APLoginNetwork.swift; sourceTree = ""; }; 43 | 53290DD91F1CEA2B003B7ADA /* APLoginTextFieldController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APLoginTextFieldController.swift; sourceTree = ""; }; 44 | 53290DDA1F1CEA2B003B7ADA /* APLoginViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APLoginViewController.swift; sourceTree = ""; }; 45 | 53290DE01F1CEA60003B7ADA /* APError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APError.swift; sourceTree = ""; }; 46 | 53290DE31F1CEA7C003B7ADA /* APConstant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APConstant.swift; sourceTree = ""; }; 47 | 53290DE51F1CEAD2003B7ADA /* APAlert.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APAlert.swift; sourceTree = ""; }; 48 | 53290DE71F1CEB4F003B7ADA /* APColor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APColor.swift; sourceTree = ""; }; 49 | 53290DE91F1CEBBA003B7ADA /* APApplication.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APApplication.swift; sourceTree = ""; }; 50 | 53290DEC1F1CEEF8003B7ADA /* CALayer+APFunction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CALayer+APFunction.swift"; sourceTree = ""; }; 51 | 66CAB3466EC2978368DC9B58 /* Pods-Modlizer.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Modlizer.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Modlizer/Pods-Modlizer.debug.xcconfig"; sourceTree = ""; }; 52 | 8E59733BB023E3D26FD1E036 /* Pods_Modlizer.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Modlizer.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 53 | /* End PBXFileReference section */ 54 | 55 | /* Begin PBXFrameworksBuildPhase section */ 56 | 530D84651F1CE7A400565155 /* Frameworks */ = { 57 | isa = PBXFrameworksBuildPhase; 58 | buildActionMask = 2147483647; 59 | files = ( 60 | 0E0CB2E4FDA6200DD4FE01FB /* Pods_Modlizer.framework in Frameworks */, 61 | ); 62 | runOnlyForDeploymentPostprocessing = 0; 63 | }; 64 | /* End PBXFrameworksBuildPhase section */ 65 | 66 | /* Begin PBXGroup section */ 67 | 3083A8BB56BE67CD8B9A86F9 /* Pods */ = { 68 | isa = PBXGroup; 69 | children = ( 70 | 66CAB3466EC2978368DC9B58 /* Pods-Modlizer.debug.xcconfig */, 71 | 107F1222A449DF9FC786CD6D /* Pods-Modlizer.release.xcconfig */, 72 | ); 73 | name = Pods; 74 | sourceTree = ""; 75 | }; 76 | 530D845F1F1CE7A300565155 = { 77 | isa = PBXGroup; 78 | children = ( 79 | 530D846A1F1CE7A400565155 /* Modlizer */, 80 | 530D84691F1CE7A400565155 /* Products */, 81 | 3083A8BB56BE67CD8B9A86F9 /* Pods */, 82 | CDFBE9B319757FCD07571945 /* Frameworks */, 83 | ); 84 | sourceTree = ""; 85 | }; 86 | 530D84691F1CE7A400565155 /* Products */ = { 87 | isa = PBXGroup; 88 | children = ( 89 | 530D84681F1CE7A400565155 /* Modlizer.app */, 90 | ); 91 | name = Products; 92 | sourceTree = ""; 93 | }; 94 | 530D846A1F1CE7A400565155 /* Modlizer */ = { 95 | isa = PBXGroup; 96 | children = ( 97 | 53290DE21F1CEA7C003B7ADA /* data */, 98 | 53290DD51F1CEA2B003B7ADA /* slices */, 99 | 530D84851F1CE82C00565155 /* storyboard */, 100 | 530D84871F1CE82C00565155 /* support */, 101 | 530D846B1F1CE7A400565155 /* AppDelegate.swift */, 102 | 530D84721F1CE7A400565155 /* Assets.xcassets */, 103 | 530D84741F1CE7A400565155 /* LaunchScreen.storyboard */, 104 | 530D84771F1CE7A400565155 /* Info.plist */, 105 | ); 106 | path = Modlizer; 107 | sourceTree = ""; 108 | }; 109 | 530D84851F1CE82C00565155 /* storyboard */ = { 110 | isa = PBXGroup; 111 | children = ( 112 | 530D84861F1CE82C00565155 /* Main.storyboard */, 113 | ); 114 | path = storyboard; 115 | sourceTree = ""; 116 | }; 117 | 530D84871F1CE82C00565155 /* support */ = { 118 | isa = PBXGroup; 119 | children = ( 120 | 53290DEB1F1CEEF8003B7ADA /* CALayer */, 121 | 53290DE91F1CEBBA003B7ADA /* APApplication.swift */, 122 | 53290DE51F1CEAD2003B7ADA /* APAlert.swift */, 123 | 53290DE71F1CEB4F003B7ADA /* APColor.swift */, 124 | 53290DE01F1CEA60003B7ADA /* APError.swift */, 125 | 53290DD11F1CEA1F003B7ADA /* APIntent.swift */, 126 | 53290DD21F1CEA1F003B7ADA /* APString.swift */, 127 | ); 128 | path = support; 129 | sourceTree = ""; 130 | }; 131 | 53290DD51F1CEA2B003B7ADA /* slices */ = { 132 | isa = PBXGroup; 133 | children = ( 134 | 53290DDA1F1CEA2B003B7ADA /* APLoginViewController.swift */, 135 | 53290DD61F1CEA2B003B7ADA /* APLoginButtonController.swift */, 136 | 53290DD91F1CEA2B003B7ADA /* APLoginTextFieldController.swift */, 137 | 53290DD71F1CEA2B003B7ADA /* APLoginData.swift */, 138 | 53290DD81F1CEA2B003B7ADA /* APLoginNetwork.swift */, 139 | ); 140 | path = slices; 141 | sourceTree = ""; 142 | }; 143 | 53290DE21F1CEA7C003B7ADA /* data */ = { 144 | isa = PBXGroup; 145 | children = ( 146 | 53290DE31F1CEA7C003B7ADA /* APConstant.swift */, 147 | ); 148 | path = data; 149 | sourceTree = ""; 150 | }; 151 | 53290DEB1F1CEEF8003B7ADA /* CALayer */ = { 152 | isa = PBXGroup; 153 | children = ( 154 | 53290DEC1F1CEEF8003B7ADA /* CALayer+APFunction.swift */, 155 | ); 156 | path = CALayer; 157 | sourceTree = ""; 158 | }; 159 | CDFBE9B319757FCD07571945 /* Frameworks */ = { 160 | isa = PBXGroup; 161 | children = ( 162 | 8E59733BB023E3D26FD1E036 /* Pods_Modlizer.framework */, 163 | ); 164 | name = Frameworks; 165 | sourceTree = ""; 166 | }; 167 | /* End PBXGroup section */ 168 | 169 | /* Begin PBXNativeTarget section */ 170 | 530D84671F1CE7A400565155 /* Modlizer */ = { 171 | isa = PBXNativeTarget; 172 | buildConfigurationList = 530D847A1F1CE7A400565155 /* Build configuration list for PBXNativeTarget "Modlizer" */; 173 | buildPhases = ( 174 | D9B7E9252426E951BD85FFDA /* [CP] Check Pods Manifest.lock */, 175 | 530D84641F1CE7A400565155 /* Sources */, 176 | 530D84651F1CE7A400565155 /* Frameworks */, 177 | 530D84661F1CE7A400565155 /* Resources */, 178 | 13D410CB77B180F92105DC9C /* [CP] Embed Pods Frameworks */, 179 | 1F601963B2FBD2A2F7BF6EF9 /* [CP] Copy Pods Resources */, 180 | ); 181 | buildRules = ( 182 | ); 183 | dependencies = ( 184 | ); 185 | name = Modlizer; 186 | productName = Modlizer; 187 | productReference = 530D84681F1CE7A400565155 /* Modlizer.app */; 188 | productType = "com.apple.product-type.application"; 189 | }; 190 | /* End PBXNativeTarget section */ 191 | 192 | /* Begin PBXProject section */ 193 | 530D84601F1CE7A300565155 /* Project object */ = { 194 | isa = PBXProject; 195 | attributes = { 196 | LastSwiftUpdateCheck = 0830; 197 | LastUpgradeCheck = 0830; 198 | ORGANIZATIONNAME = "Paul Berg"; 199 | TargetAttributes = { 200 | 530D84671F1CE7A400565155 = { 201 | CreatedOnToolsVersion = 8.3.3; 202 | ProvisioningStyle = Automatic; 203 | }; 204 | }; 205 | }; 206 | buildConfigurationList = 530D84631F1CE7A300565155 /* Build configuration list for PBXProject "Modlizer" */; 207 | compatibilityVersion = "Xcode 3.2"; 208 | developmentRegion = English; 209 | hasScannedForEncodings = 0; 210 | knownRegions = ( 211 | en, 212 | Base, 213 | ); 214 | mainGroup = 530D845F1F1CE7A300565155; 215 | productRefGroup = 530D84691F1CE7A400565155 /* Products */; 216 | projectDirPath = ""; 217 | projectRoot = ""; 218 | targets = ( 219 | 530D84671F1CE7A400565155 /* Modlizer */, 220 | ); 221 | }; 222 | /* End PBXProject section */ 223 | 224 | /* Begin PBXResourcesBuildPhase section */ 225 | 530D84661F1CE7A400565155 /* Resources */ = { 226 | isa = PBXResourcesBuildPhase; 227 | buildActionMask = 2147483647; 228 | files = ( 229 | 530D84761F1CE7A400565155 /* LaunchScreen.storyboard in Resources */, 230 | 530D84731F1CE7A400565155 /* Assets.xcassets in Resources */, 231 | 530D848D1F1CE82C00565155 /* Main.storyboard in Resources */, 232 | ); 233 | runOnlyForDeploymentPostprocessing = 0; 234 | }; 235 | /* End PBXResourcesBuildPhase section */ 236 | 237 | /* Begin PBXShellScriptBuildPhase section */ 238 | 13D410CB77B180F92105DC9C /* [CP] Embed Pods Frameworks */ = { 239 | isa = PBXShellScriptBuildPhase; 240 | buildActionMask = 2147483647; 241 | files = ( 242 | ); 243 | inputPaths = ( 244 | ); 245 | name = "[CP] Embed Pods Frameworks"; 246 | outputPaths = ( 247 | ); 248 | runOnlyForDeploymentPostprocessing = 0; 249 | shellPath = /bin/sh; 250 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Modlizer/Pods-Modlizer-frameworks.sh\"\n"; 251 | showEnvVarsInLog = 0; 252 | }; 253 | 1F601963B2FBD2A2F7BF6EF9 /* [CP] Copy Pods Resources */ = { 254 | isa = PBXShellScriptBuildPhase; 255 | buildActionMask = 2147483647; 256 | files = ( 257 | ); 258 | inputPaths = ( 259 | ); 260 | name = "[CP] Copy Pods Resources"; 261 | outputPaths = ( 262 | ); 263 | runOnlyForDeploymentPostprocessing = 0; 264 | shellPath = /bin/sh; 265 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Modlizer/Pods-Modlizer-resources.sh\"\n"; 266 | showEnvVarsInLog = 0; 267 | }; 268 | D9B7E9252426E951BD85FFDA /* [CP] Check Pods Manifest.lock */ = { 269 | isa = PBXShellScriptBuildPhase; 270 | buildActionMask = 2147483647; 271 | files = ( 272 | ); 273 | inputPaths = ( 274 | ); 275 | name = "[CP] Check Pods Manifest.lock"; 276 | outputPaths = ( 277 | ); 278 | runOnlyForDeploymentPostprocessing = 0; 279 | shellPath = /bin/sh; 280 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; 281 | showEnvVarsInLog = 0; 282 | }; 283 | /* End PBXShellScriptBuildPhase section */ 284 | 285 | /* Begin PBXSourcesBuildPhase section */ 286 | 530D84641F1CE7A400565155 /* Sources */ = { 287 | isa = PBXSourcesBuildPhase; 288 | buildActionMask = 2147483647; 289 | files = ( 290 | 53290DEA1F1CEBBA003B7ADA /* APApplication.swift in Sources */, 291 | 53290DE81F1CEB4F003B7ADA /* APColor.swift in Sources */, 292 | 53290DD41F1CEA1F003B7ADA /* APString.swift in Sources */, 293 | 53290DE11F1CEA60003B7ADA /* APError.swift in Sources */, 294 | 53290DED1F1CEEF8003B7ADA /* CALayer+APFunction.swift in Sources */, 295 | 53290DDD1F1CEA2B003B7ADA /* APLoginNetwork.swift in Sources */, 296 | 53290DD31F1CEA1F003B7ADA /* APIntent.swift in Sources */, 297 | 53290DDE1F1CEA2B003B7ADA /* APLoginTextFieldController.swift in Sources */, 298 | 53290DDB1F1CEA2B003B7ADA /* APLoginButtonController.swift in Sources */, 299 | 53290DDC1F1CEA2B003B7ADA /* APLoginData.swift in Sources */, 300 | 53290DE61F1CEAD2003B7ADA /* APAlert.swift in Sources */, 301 | 530D846C1F1CE7A400565155 /* AppDelegate.swift in Sources */, 302 | 53290DE41F1CEA7C003B7ADA /* APConstant.swift in Sources */, 303 | 53290DDF1F1CEA2B003B7ADA /* APLoginViewController.swift in Sources */, 304 | ); 305 | runOnlyForDeploymentPostprocessing = 0; 306 | }; 307 | /* End PBXSourcesBuildPhase section */ 308 | 309 | /* Begin PBXVariantGroup section */ 310 | 530D84741F1CE7A400565155 /* LaunchScreen.storyboard */ = { 311 | isa = PBXVariantGroup; 312 | children = ( 313 | 530D84751F1CE7A400565155 /* Base */, 314 | ); 315 | name = LaunchScreen.storyboard; 316 | sourceTree = ""; 317 | }; 318 | /* End PBXVariantGroup section */ 319 | 320 | /* Begin XCBuildConfiguration section */ 321 | 530D84781F1CE7A400565155 /* Debug */ = { 322 | isa = XCBuildConfiguration; 323 | buildSettings = { 324 | ALWAYS_SEARCH_USER_PATHS = NO; 325 | CLANG_ANALYZER_NONNULL = YES; 326 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 327 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 328 | CLANG_CXX_LIBRARY = "libc++"; 329 | CLANG_ENABLE_MODULES = YES; 330 | CLANG_ENABLE_OBJC_ARC = YES; 331 | CLANG_WARN_BOOL_CONVERSION = YES; 332 | CLANG_WARN_CONSTANT_CONVERSION = YES; 333 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 334 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 335 | CLANG_WARN_EMPTY_BODY = YES; 336 | CLANG_WARN_ENUM_CONVERSION = YES; 337 | CLANG_WARN_INFINITE_RECURSION = YES; 338 | CLANG_WARN_INT_CONVERSION = YES; 339 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 340 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 341 | CLANG_WARN_UNREACHABLE_CODE = YES; 342 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 343 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 344 | COPY_PHASE_STRIP = NO; 345 | DEBUG_INFORMATION_FORMAT = dwarf; 346 | ENABLE_STRICT_OBJC_MSGSEND = YES; 347 | ENABLE_TESTABILITY = YES; 348 | GCC_C_LANGUAGE_STANDARD = gnu99; 349 | GCC_DYNAMIC_NO_PIC = NO; 350 | GCC_NO_COMMON_BLOCKS = YES; 351 | GCC_OPTIMIZATION_LEVEL = 0; 352 | GCC_PREPROCESSOR_DEFINITIONS = ( 353 | "DEBUG=1", 354 | "$(inherited)", 355 | ); 356 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 357 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 358 | GCC_WARN_UNDECLARED_SELECTOR = YES; 359 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 360 | GCC_WARN_UNUSED_FUNCTION = YES; 361 | GCC_WARN_UNUSED_VARIABLE = YES; 362 | IPHONEOS_DEPLOYMENT_TARGET = 10.3; 363 | MTL_ENABLE_DEBUG_INFO = YES; 364 | ONLY_ACTIVE_ARCH = YES; 365 | SDKROOT = iphoneos; 366 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 367 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 368 | }; 369 | name = Debug; 370 | }; 371 | 530D84791F1CE7A400565155 /* Release */ = { 372 | isa = XCBuildConfiguration; 373 | buildSettings = { 374 | ALWAYS_SEARCH_USER_PATHS = NO; 375 | CLANG_ANALYZER_NONNULL = YES; 376 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 377 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 378 | CLANG_CXX_LIBRARY = "libc++"; 379 | CLANG_ENABLE_MODULES = YES; 380 | CLANG_ENABLE_OBJC_ARC = YES; 381 | CLANG_WARN_BOOL_CONVERSION = YES; 382 | CLANG_WARN_CONSTANT_CONVERSION = YES; 383 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 384 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 385 | CLANG_WARN_EMPTY_BODY = YES; 386 | CLANG_WARN_ENUM_CONVERSION = YES; 387 | CLANG_WARN_INFINITE_RECURSION = YES; 388 | CLANG_WARN_INT_CONVERSION = YES; 389 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 390 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 391 | CLANG_WARN_UNREACHABLE_CODE = YES; 392 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 393 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 394 | COPY_PHASE_STRIP = NO; 395 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 396 | ENABLE_NS_ASSERTIONS = NO; 397 | ENABLE_STRICT_OBJC_MSGSEND = YES; 398 | GCC_C_LANGUAGE_STANDARD = gnu99; 399 | GCC_NO_COMMON_BLOCKS = YES; 400 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 401 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 402 | GCC_WARN_UNDECLARED_SELECTOR = YES; 403 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 404 | GCC_WARN_UNUSED_FUNCTION = YES; 405 | GCC_WARN_UNUSED_VARIABLE = YES; 406 | IPHONEOS_DEPLOYMENT_TARGET = 10.3; 407 | MTL_ENABLE_DEBUG_INFO = NO; 408 | SDKROOT = iphoneos; 409 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 410 | VALIDATE_PRODUCT = YES; 411 | }; 412 | name = Release; 413 | }; 414 | 530D847B1F1CE7A400565155 /* Debug */ = { 415 | isa = XCBuildConfiguration; 416 | baseConfigurationReference = 66CAB3466EC2978368DC9B58 /* Pods-Modlizer.debug.xcconfig */; 417 | buildSettings = { 418 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 419 | INFOPLIST_FILE = Modlizer/Info.plist; 420 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 421 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 422 | PRODUCT_BUNDLE_IDENTIFIER = com.Modlizer; 423 | PRODUCT_NAME = "$(TARGET_NAME)"; 424 | SWIFT_VERSION = 3.0; 425 | }; 426 | name = Debug; 427 | }; 428 | 530D847C1F1CE7A400565155 /* Release */ = { 429 | isa = XCBuildConfiguration; 430 | baseConfigurationReference = 107F1222A449DF9FC786CD6D /* Pods-Modlizer.release.xcconfig */; 431 | buildSettings = { 432 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 433 | INFOPLIST_FILE = Modlizer/Info.plist; 434 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 435 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 436 | PRODUCT_BUNDLE_IDENTIFIER = com.Modlizer; 437 | PRODUCT_NAME = "$(TARGET_NAME)"; 438 | SWIFT_VERSION = 3.0; 439 | }; 440 | name = Release; 441 | }; 442 | /* End XCBuildConfiguration section */ 443 | 444 | /* Begin XCConfigurationList section */ 445 | 530D84631F1CE7A300565155 /* Build configuration list for PBXProject "Modlizer" */ = { 446 | isa = XCConfigurationList; 447 | buildConfigurations = ( 448 | 530D84781F1CE7A400565155 /* Debug */, 449 | 530D84791F1CE7A400565155 /* Release */, 450 | ); 451 | defaultConfigurationIsVisible = 0; 452 | defaultConfigurationName = Release; 453 | }; 454 | 530D847A1F1CE7A400565155 /* Build configuration list for PBXNativeTarget "Modlizer" */ = { 455 | isa = XCConfigurationList; 456 | buildConfigurations = ( 457 | 530D847B1F1CE7A400565155 /* Debug */, 458 | 530D847C1F1CE7A400565155 /* Release */, 459 | ); 460 | defaultConfigurationIsVisible = 0; 461 | defaultConfigurationName = Release; 462 | }; 463 | /* End XCConfigurationList section */ 464 | }; 465 | rootObject = 530D84601F1CE7A300565155 /* Project object */; 466 | } 467 | -------------------------------------------------------------------------------- /Modlizer/storyboard/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 35 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | --------------------------------------------------------------------------------