├── 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 | 
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 |
--------------------------------------------------------------------------------