├── CellRepresentable.xcodeproj
├── xcuserdata
│ └── iankeen.xcuserdatad
│ │ ├── xcdebugger
│ │ └── Breakpoints_v2.xcbkptlist
│ │ └── xcschemes
│ │ ├── xcschememanagement.plist
│ │ └── CellRepresentable.xcscheme
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcuserdata
│ │ └── iankeen.xcuserdatad
│ │ └── UserInterfaceState.xcuserstate
└── project.pbxproj
├── CellRepresentable
├── CellRepresentable
│ └── CellRepresentable.swift
├── ViewControllers
│ ├── IntViewController
│ │ ├── IntViewModel.swift
│ │ ├── IntViewController.swift
│ │ └── IntViewController.xib
│ ├── StringViewController
│ │ ├── StringViewModel.swift
│ │ ├── StringViewController.swift
│ │ └── StringViewController.xib
│ └── HomeViewController
│ │ ├── HomeViewModel.swift
│ │ ├── HomeViewController.swift
│ │ └── HomeViewController.xib
├── Cells
│ ├── IntCell
│ │ ├── IntCell.swift
│ │ ├── IntCellViewModel.swift
│ │ └── IntCell.xib
│ └── StringCell
│ │ ├── StringCell.swift
│ │ ├── StringCellViewModel.swift
│ │ └── StringCell.xib
├── Assets.xcassets
│ └── AppIcon.appiconset
│ │ └── Contents.json
├── AppDelegate.swift
├── Info.plist
├── Helpers.swift
├── Coordinators
│ └── Navigation
│ │ └── NavigationCoordinator.swift
└── Base.lproj
│ └── LaunchScreen.storyboard
└── README.md
/CellRepresentable.xcodeproj/xcuserdata/iankeen.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
--------------------------------------------------------------------------------
/CellRepresentable.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/CellRepresentable.xcodeproj/project.xcworkspace/xcuserdata/iankeen.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IanKeen/CellRepresentable/HEAD/CellRepresentable.xcodeproj/project.xcworkspace/xcuserdata/iankeen.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/CellRepresentable/CellRepresentable/CellRepresentable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CellRepresentable.swift
3 | // CellRepresentable
4 | //
5 | // Created by Ian Keen on 8/04/2016.
6 | // Copyright © 2016 Mustard. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | protocol CellRepresentable {
12 | static func registerCell(tableView: UITableView)
13 | func cellInstance(tableView: UITableView, indexPath: NSIndexPath) -> UITableViewCell
14 | func cellSelected()
15 | }
16 |
--------------------------------------------------------------------------------
/CellRepresentable/ViewControllers/IntViewController/IntViewModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // IntViewModel.swift
3 | // CellRepresentable
4 | //
5 | // Created by Ian Keen on 10/04/2016.
6 | // Copyright © 2016 Mustard. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class IntViewModel {
12 | //MARK: - Outlet
13 | let displayValue: String
14 |
15 | //MARK: - Lifecycle
16 | init(value: Int) {
17 | self.displayValue = "\(value)"
18 | }
19 | }
--------------------------------------------------------------------------------
/CellRepresentable/ViewControllers/StringViewController/StringViewModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // StringViewModel.swift
3 | // CellRepresentable
4 | //
5 | // Created by Ian Keen on 10/04/2016.
6 | // Copyright © 2016 Mustard. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class StringViewModel {
12 | //MARK: - Outlet
13 | let displayValue: String
14 |
15 | //MARK: - Lifecycle
16 | init(value: String) {
17 | self.displayValue = value
18 | }
19 | }
--------------------------------------------------------------------------------
/CellRepresentable/Cells/IntCell/IntCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // IntCell.swift
3 | // CellRepresentable
4 | //
5 | // Created by Ian Keen on 8/04/2016.
6 | // Copyright © 2016 Mustard. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | class IntCell: UITableViewCell {
12 | //MARK: - IBOutlets
13 | @IBOutlet private var valueLabel: UILabel!
14 |
15 | //MARK: - Public
16 | func setup(viewModel: IntCellViewModel) {
17 | self.valueLabel.text = viewModel.displayValue
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/CellRepresentable/Cells/StringCell/StringCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // StringCell.swift
3 | // CellRepresentable
4 | //
5 | // Created by Ian Keen on 8/04/2016.
6 | // Copyright © 2016 Mustard. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | class StringCell: UITableViewCell {
12 | //MARK: - IBOutlets
13 | @IBOutlet private var valueLabel: UILabel!
14 |
15 | //MARK: - Public
16 | func setup(viewModel: StringCellViewModel) {
17 | self.valueLabel.text = viewModel.displayValue
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # [Separation of concerns: UI Edition](https://medium.com/@IanKeen/1916a35a6899)
2 | This is the accompanying project to the blog post.
3 |
4 | It showcases a way to architect a project such that:
5 |
6 | - View controllers are not responsible for navigation, nor aware of each other.
7 | - Table views are not aware of the specific types of cells they display.
8 |
9 | Thus decoupling everything in the UI layer in the same manner as other service layer objects.
10 |
11 | If you found this helpful I'd love a 'Recommend' on Medium and/or a Retweet :D
12 |
--------------------------------------------------------------------------------
/CellRepresentable.xcodeproj/xcuserdata/iankeen.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | CellRepresentable.xcscheme
8 |
9 | orderHint
10 | 0
11 |
12 |
13 | SuppressBuildableAutocreation
14 |
15 | 320307671CB854F70059991C
16 |
17 | primary
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/CellRepresentable/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "29x29",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "29x29",
11 | "scale" : "3x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "40x40",
16 | "scale" : "2x"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "size" : "40x40",
21 | "scale" : "3x"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "size" : "60x60",
26 | "scale" : "2x"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "size" : "60x60",
31 | "scale" : "3x"
32 | }
33 | ],
34 | "info" : {
35 | "version" : 1,
36 | "author" : "xcode"
37 | }
38 | }
--------------------------------------------------------------------------------
/CellRepresentable/ViewControllers/IntViewController/IntViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // IntViewController.swift
3 | // CellRepresentable
4 | //
5 | // Created by Ian Keen on 10/04/2016.
6 | // Copyright © 2016 Mustard. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | class IntViewController: UIViewController {
12 | //MARK: - Private
13 | private var viewModel: IntViewModel!
14 |
15 | //MARK: - IBOutlet
16 | @IBOutlet private var label: UILabel!
17 |
18 | //MARK: - Lifecycle
19 | convenience init(viewModel: IntViewModel) {
20 | self.init(nibName: nil, bundle: nil)
21 | self.viewModel = viewModel
22 | }
23 | override func viewDidLoad() {
24 | super.viewDidLoad()
25 | self.title = "Number"
26 | self.label.text = self.viewModel.displayValue
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/CellRepresentable/ViewControllers/StringViewController/StringViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // StringViewController.swift
3 | // CellRepresentable
4 | //
5 | // Created by Ian Keen on 10/04/2016.
6 | // Copyright © 2016 Mustard. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | class StringViewController: UIViewController {
12 | //MARK: - Private
13 | private var viewModel: StringViewModel!
14 |
15 | //MARK: - IBOutlet
16 | @IBOutlet private var label: UILabel!
17 |
18 | //MARK: - Lifecycle
19 | convenience init(viewModel: StringViewModel) {
20 | self.init(nibName: nil, bundle: nil)
21 | self.viewModel = viewModel
22 | }
23 | override func viewDidLoad() {
24 | super.viewDidLoad()
25 | self.title = "String"
26 | self.label.text = self.viewModel.displayValue
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/CellRepresentable/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // CellRepresentable
4 | //
5 | // Created by Ian Keen on 8/04/2016.
6 | // Copyright © 2016 Mustard. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @UIApplicationMain
12 | class AppDelegate: UIResponder, UIApplicationDelegate {
13 | var window: UIWindow?
14 | var navigationCoordinator: NavigationCoordinator!
15 |
16 | func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
17 | self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
18 | let navController = UINavigationController()
19 |
20 | self.navigationCoordinator = NavigationCoordinator(navigationController: navController)
21 | self.navigationCoordinator.start()
22 |
23 | self.window?.rootViewController = navController
24 | self.window?.makeKeyAndVisible()
25 | return true
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/CellRepresentable/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 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1
23 | LSRequiresIPhoneOS
24 |
25 | UILaunchStoryboardName
26 | LaunchScreen
27 | UIRequiredDeviceCapabilities
28 |
29 | armv7
30 |
31 | UISupportedInterfaceOrientations
32 |
33 | UIInterfaceOrientationPortrait
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/CellRepresentable/Cells/IntCell/IntCellViewModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // IntCellViewModel.swift
3 | // CellRepresentable
4 | //
5 | // Created by Ian Keen on 8/04/2016.
6 | // Copyright © 2016 Mustard. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | class IntCellViewModel {
12 | //MARK: - Private
13 | private let rawValue: Int
14 |
15 | //MARK: - Outputs
16 | let displayValue: String
17 |
18 | //MARK: - Events
19 | var didSelectInteger: ((Int) -> Void)?
20 |
21 | //MARK: - Lifecycle
22 | init(value: Int) {
23 | self.rawValue = value
24 | self.displayValue = "\(value)"
25 | }
26 | }
27 |
28 | //MARK: - CellRepresentable
29 | extension IntCellViewModel: CellRepresentable {
30 | static func registerCell(tableView: UITableView) {
31 | tableView.registerNib(UINib(nibName: String(IntCell), bundle: nil), forCellReuseIdentifier: String(IntCell))
32 | }
33 | func cellInstance(tableView: UITableView, indexPath: NSIndexPath) -> UITableViewCell {
34 | let cell = tableView.dequeueReusableCellWithIdentifier(String(IntCell), forIndexPath: indexPath) as! IntCell
35 | cell.setup(self)
36 | return cell
37 | }
38 | func cellSelected() {
39 | self.didSelectInteger?(self.rawValue)
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/CellRepresentable/Cells/StringCell/StringCellViewModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // StringCellViewModel.swift
3 | // CellRepresentable
4 | //
5 | // Created by Ian Keen on 8/04/2016.
6 | // Copyright © 2016 Mustard. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | class StringCellViewModel {
12 | //MARK: - Private
13 | private let rawValue: Int
14 |
15 | //MARK: - Outputs
16 | let displayValue: String
17 |
18 | //MARK: - Events
19 | var didSelectString: ((String) -> Void)?
20 |
21 | //MARK: - Lifecycle
22 | init(value: Int) {
23 | self.rawValue = value
24 | self.displayValue = value.asWords ?? "Unknown"
25 | }
26 | }
27 |
28 | //MARK: - CellRepresentable
29 | extension StringCellViewModel: CellRepresentable {
30 | static func registerCell(tableView: UITableView) {
31 | tableView.registerNib(UINib(nibName: String(StringCell), bundle: nil), forCellReuseIdentifier: String(StringCell))
32 | }
33 | func cellInstance(tableView: UITableView, indexPath: NSIndexPath) -> UITableViewCell {
34 | let cell = tableView.dequeueReusableCellWithIdentifier(String(StringCell), forIndexPath: indexPath) as! StringCell
35 | cell.setup(self)
36 | return cell
37 | }
38 | func cellSelected() {
39 | self.didSelectString?("\(self.rawValue)")
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/CellRepresentable/Helpers.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Helpers.swift
3 | // CellRepresentable
4 | //
5 | // Created by Ian Keen on 8/04/2016.
6 | // Copyright © 2016 Mustard. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | /*
12 | Stuff in here is just to make the main code more consumable
13 | */
14 |
15 | func random(min min: Int, max: Int) -> Int {
16 | return Int(arc4random_uniform(UInt32(max + 1)) + UInt32(min))
17 | }
18 | extension CollectionType where Self.Index == Int {
19 | func randomElement() -> Self.Generator.Element {
20 | let index = random(min: 0, max: self.count - 1)
21 | return self[index]
22 | }
23 | subscript(safe safe: Self.Index) -> Generator.Element? {
24 | guard self.indices.contains(safe) else { return nil }
25 | return self[safe]
26 | }
27 | }
28 |
29 | private let units = [
30 | "", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten",
31 | "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"
32 | ]
33 | private let tens = ["", "ten", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"]
34 |
35 | extension Int {
36 | var asWords: String? {
37 | if (self < 20) { return units[safe: self] }
38 |
39 | let value = tens[safe: self / 10] ?? ""
40 | let remainder = units[safe: self % 10] ?? ""
41 | return "\(value) \(remainder)"
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/CellRepresentable/Coordinators/Navigation/NavigationCoordinator.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NavigationCoordinator.swift
3 | // CellRepresentable
4 | //
5 | // Created by Ian Keen on 8/04/2016.
6 | // Copyright © 2016 Mustard. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | class NavigationCoordinator {
12 | //MARK: - Private Properties
13 | private let navigationController: UINavigationController
14 |
15 | //MARK: - Lifecycle
16 | init(navigationController: UINavigationController) {
17 | self.navigationController = navigationController
18 | }
19 |
20 | //MARK: - Public
21 | func start() {
22 | self.showHome()
23 | }
24 |
25 | //MARK: - Private
26 | private func showHome(animated: Bool = false) {
27 | let viewModel = HomeViewModel()
28 | viewModel.didSelectInteger = self.showInt
29 | viewModel.didSelectString = self.showString
30 |
31 | let viewController = HomeViewController(viewModel: viewModel)
32 | self.navigationController.pushViewController(viewController, animated: animated)
33 | }
34 | private func showInt(value: Int) {
35 | let viewModel = IntViewModel(value: value)
36 | let viewController = IntViewController(viewModel: viewModel)
37 | self.navigationController.pushViewController(viewController, animated: true)
38 | }
39 | private func showString(value: String) {
40 | let viewModel = StringViewModel(value: value)
41 | let viewController = StringViewController(viewModel: viewModel)
42 | self.navigationController.pushViewController(viewController, animated: true)
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/CellRepresentable/ViewControllers/HomeViewController/HomeViewModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // HomeViewModel.swift
3 | // CellRepresentable
4 | //
5 | // Created by Ian Keen on 8/04/2016.
6 | // Copyright © 2016 Mustard. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class HomeViewModel {
12 | //MARK: - Outputs
13 | let tableItemTypes: [CellRepresentable.Type] = [StringCellViewModel.self, IntCellViewModel.self]
14 | private(set) var tableItems = [CellRepresentable]()
15 |
16 | //MARK: - Events
17 | var didUpdate: (() -> Void)?
18 | var didSelectInteger: ((Int) -> Void)?
19 | var didSelectString: ((String) -> Void)?
20 |
21 | //MARK: - Inputs
22 | func refreshData() {
23 | self.tableItems = self.randomTableItems()
24 | self.didUpdate?()
25 | }
26 | }
27 |
28 | //MARK: - Mock Data Generation
29 | extension HomeViewModel {
30 | func randomTableItems() -> [CellRepresentable] {
31 | return (1...30).map { value in
32 | let rand = random(min: 0, max: 1)
33 |
34 | if (rand == 0) {
35 | return self.stringCellViewModel(value)
36 | } else {
37 | return self.intCellViewModel(value)
38 | }
39 | }
40 | }
41 |
42 | private func stringCellViewModel(value: Int) -> StringCellViewModel {
43 | let instance = StringCellViewModel(value: value)
44 | instance.didSelectString = { self.didSelectString?($0) }
45 | return instance
46 | }
47 | private func intCellViewModel(value: Int) -> IntCellViewModel {
48 | let instance = IntCellViewModel(value: value)
49 | instance.didSelectInteger = { self.didSelectInteger?($0) }
50 | return instance
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/CellRepresentable/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 |
--------------------------------------------------------------------------------
/CellRepresentable/ViewControllers/HomeViewController/HomeViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // HomeViewController.swift
3 | // CellRepresentable
4 | //
5 | // Created by Ian Keen on 8/04/2016.
6 | // Copyright © 2016 Mustard. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | class HomeViewController: UIViewController {
12 | //MARK: - IBOutlets
13 | @IBOutlet private var tableView: UITableView!
14 |
15 | //MARK: - Private Properties
16 | private var viewModel: HomeViewModel!
17 |
18 | //MARK: - Lifecycle
19 | convenience init(viewModel: HomeViewModel) {
20 | self.init(nibName: nil, bundle: nil)
21 | self.viewModel = viewModel
22 | }
23 | override func viewDidLoad() {
24 | super.viewDidLoad()
25 | self.title = "Home"
26 | self.tableView.estimatedRowHeight = 50
27 |
28 | self.addRefreshButton()
29 |
30 | self.viewModel.tableItemTypes.forEach { $0.registerCell(self.tableView) }
31 | self.viewModel.didUpdate = self.refreshUI
32 | self.viewModel.refreshData()
33 | }
34 | override func viewDidAppear(animated: Bool) {
35 | super.viewDidAppear(animated)
36 | self.tableView.indexPathsForSelectedRows?
37 | .forEach { self.tableView.deselectRowAtIndexPath($0, animated: true) }
38 | }
39 |
40 | //MARK: - Private
41 | private func addRefreshButton() {
42 | let refresh = UIBarButtonItem(title: "Refresh", style: .Plain, target: self, action: "refreshButtonTouchUpInside")
43 | self.navigationItem.leftBarButtonItem = refresh
44 | }
45 | private func refreshUI() {
46 | self.tableView.reloadData()
47 | }
48 |
49 | //MARK: - Actions
50 | @IBAction private func refreshButtonTouchUpInside() {
51 | self.viewModel.refreshData()
52 | }
53 | }
54 |
55 | //MARK: - UITableViewDataSource
56 | extension HomeViewController: UITableViewDataSource {
57 | func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
58 | return self.viewModel.tableItems.count
59 | }
60 | func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
61 | let cellViewModel = self.viewModel.tableItems[indexPath.row]
62 | return cellViewModel.cellInstance(tableView, indexPath: indexPath)
63 | }
64 | }
65 |
66 | //MARK: - UITableViewDelegate
67 | extension HomeViewController: UITableViewDelegate {
68 | func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
69 | let cellViewModel = self.viewModel.tableItems[indexPath.row]
70 | cellViewModel.cellSelected()
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/CellRepresentable/ViewControllers/HomeViewController/HomeViewController.xib:
--------------------------------------------------------------------------------
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 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/CellRepresentable/Cells/IntCell/IntCell.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/CellRepresentable/Cells/StringCell/StringCell.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/CellRepresentable.xcodeproj/xcuserdata/iankeen.xcuserdatad/xcschemes/CellRepresentable.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 |
--------------------------------------------------------------------------------
/CellRepresentable/ViewControllers/StringViewController/StringViewController.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
31 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
--------------------------------------------------------------------------------
/CellRepresentable/ViewControllers/IntViewController/IntViewController.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
31 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
--------------------------------------------------------------------------------
/CellRepresentable.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 3203076C1CB854F70059991C /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3203076B1CB854F70059991C /* AppDelegate.swift */; };
11 | 320307731CB854F70059991C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 320307721CB854F70059991C /* Assets.xcassets */; };
12 | 320307761CB854F70059991C /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 320307741CB854F70059991C /* LaunchScreen.storyboard */; };
13 | 320307831CB8558C0059991C /* HomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 320307811CB8558C0059991C /* HomeViewController.swift */; };
14 | 320307841CB8558C0059991C /* HomeViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 320307821CB8558C0059991C /* HomeViewController.xib */; };
15 | 320307861CB855A70059991C /* HomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 320307851CB855A70059991C /* HomeViewModel.swift */; };
16 | 320307881CB855C90059991C /* CellRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 320307871CB855C90059991C /* CellRepresentable.swift */; };
17 | 320307931CB8654B0059991C /* StringCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 320307911CB8654B0059991C /* StringCell.swift */; };
18 | 320307941CB8654B0059991C /* StringCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 320307921CB8654B0059991C /* StringCell.xib */; };
19 | 320307971CB8668B0059991C /* IntCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 320307951CB8668B0059991C /* IntCell.swift */; };
20 | 320307981CB8668B0059991C /* IntCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 320307961CB8668B0059991C /* IntCell.xib */; };
21 | 3203079A1CB86AFB0059991C /* IntCellViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 320307991CB86AFB0059991C /* IntCellViewModel.swift */; };
22 | 3203079C1CB86B0B0059991C /* StringCellViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3203079B1CB86B0B0059991C /* StringCellViewModel.swift */; };
23 | 3203079E1CB86E670059991C /* Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3203079D1CB86E670059991C /* Helpers.swift */; };
24 | 320307A41CB885C90059991C /* NavigationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 320307A31CB885C90059991C /* NavigationCoordinator.swift */; };
25 | 320307A91CBAB8630059991C /* IntViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 320307A71CBAB8630059991C /* IntViewController.swift */; };
26 | 320307AA1CBAB8630059991C /* IntViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 320307A81CBAB8630059991C /* IntViewController.xib */; };
27 | 320307AC1CBAB8770059991C /* IntViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 320307AB1CBAB8770059991C /* IntViewModel.swift */; };
28 | 320307AF1CBAB8920059991C /* StringViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 320307AD1CBAB8920059991C /* StringViewController.swift */; };
29 | 320307B01CBAB8920059991C /* StringViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 320307AE1CBAB8920059991C /* StringViewController.xib */; };
30 | 320307B21CBAB8E50059991C /* StringViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 320307B11CBAB8E50059991C /* StringViewModel.swift */; };
31 | /* End PBXBuildFile section */
32 |
33 | /* Begin PBXFileReference section */
34 | 320307681CB854F70059991C /* CellRepresentable.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CellRepresentable.app; sourceTree = BUILT_PRODUCTS_DIR; };
35 | 3203076B1CB854F70059991C /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
36 | 320307721CB854F70059991C /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
37 | 320307751CB854F70059991C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
38 | 320307771CB854F70059991C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
39 | 320307811CB8558C0059991C /* HomeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HomeViewController.swift; sourceTree = ""; };
40 | 320307821CB8558C0059991C /* HomeViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = HomeViewController.xib; sourceTree = ""; };
41 | 320307851CB855A70059991C /* HomeViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HomeViewModel.swift; sourceTree = ""; };
42 | 320307871CB855C90059991C /* CellRepresentable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CellRepresentable.swift; sourceTree = ""; };
43 | 320307911CB8654B0059991C /* StringCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = StringCell.swift; path = CellRepresentable/Cells/StringCell/StringCell.swift; sourceTree = SOURCE_ROOT; };
44 | 320307921CB8654B0059991C /* StringCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = StringCell.xib; path = CellRepresentable/Cells/StringCell/StringCell.xib; sourceTree = SOURCE_ROOT; };
45 | 320307951CB8668B0059991C /* IntCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IntCell.swift; sourceTree = ""; };
46 | 320307961CB8668B0059991C /* IntCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IntCell.xib; sourceTree = ""; };
47 | 320307991CB86AFB0059991C /* IntCellViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IntCellViewModel.swift; sourceTree = ""; };
48 | 3203079B1CB86B0B0059991C /* StringCellViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StringCellViewModel.swift; sourceTree = ""; };
49 | 3203079D1CB86E670059991C /* Helpers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Helpers.swift; sourceTree = ""; };
50 | 320307A31CB885C90059991C /* NavigationCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NavigationCoordinator.swift; sourceTree = ""; };
51 | 320307A71CBAB8630059991C /* IntViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IntViewController.swift; sourceTree = ""; };
52 | 320307A81CBAB8630059991C /* IntViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IntViewController.xib; sourceTree = ""; };
53 | 320307AB1CBAB8770059991C /* IntViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IntViewModel.swift; sourceTree = ""; };
54 | 320307AD1CBAB8920059991C /* StringViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StringViewController.swift; sourceTree = ""; };
55 | 320307AE1CBAB8920059991C /* StringViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = StringViewController.xib; sourceTree = ""; };
56 | 320307B11CBAB8E50059991C /* StringViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StringViewModel.swift; sourceTree = ""; };
57 | /* End PBXFileReference section */
58 |
59 | /* Begin PBXFrameworksBuildPhase section */
60 | 320307651CB854F70059991C /* Frameworks */ = {
61 | isa = PBXFrameworksBuildPhase;
62 | buildActionMask = 2147483647;
63 | files = (
64 | );
65 | runOnlyForDeploymentPostprocessing = 0;
66 | };
67 | /* End PBXFrameworksBuildPhase section */
68 |
69 | /* Begin PBXGroup section */
70 | 3203075F1CB854F70059991C = {
71 | isa = PBXGroup;
72 | children = (
73 | 3203076A1CB854F70059991C /* CellRepresentable */,
74 | 320307691CB854F70059991C /* Products */,
75 | );
76 | sourceTree = "";
77 | };
78 | 320307691CB854F70059991C /* Products */ = {
79 | isa = PBXGroup;
80 | children = (
81 | 320307681CB854F70059991C /* CellRepresentable.app */,
82 | );
83 | name = Products;
84 | sourceTree = "";
85 | };
86 | 3203076A1CB854F70059991C /* CellRepresentable */ = {
87 | isa = PBXGroup;
88 | children = (
89 | 320307A11CB885B30059991C /* Coordinators */,
90 | 3203077D1CB8555E0059991C /* CellRepresentable */,
91 | 3203077E1CB8555E0059991C /* Cells */,
92 | 3203077F1CB8555E0059991C /* ViewControllers */,
93 | 3203076B1CB854F70059991C /* AppDelegate.swift */,
94 | 3203079D1CB86E670059991C /* Helpers.swift */,
95 | 320307721CB854F70059991C /* Assets.xcassets */,
96 | 320307741CB854F70059991C /* LaunchScreen.storyboard */,
97 | 320307771CB854F70059991C /* Info.plist */,
98 | );
99 | path = CellRepresentable;
100 | sourceTree = "";
101 | };
102 | 3203077D1CB8555E0059991C /* CellRepresentable */ = {
103 | isa = PBXGroup;
104 | children = (
105 | 320307871CB855C90059991C /* CellRepresentable.swift */,
106 | );
107 | path = CellRepresentable;
108 | sourceTree = "";
109 | };
110 | 3203077E1CB8555E0059991C /* Cells */ = {
111 | isa = PBXGroup;
112 | children = (
113 | 3203078F1CB864DF0059991C /* IntCell */,
114 | 320307901CB864DF0059991C /* StringCell */,
115 | );
116 | path = Cells;
117 | sourceTree = "";
118 | };
119 | 3203077F1CB8555E0059991C /* ViewControllers */ = {
120 | isa = PBXGroup;
121 | children = (
122 | 320307801CB855810059991C /* HomeViewController */,
123 | 320307A51CB88B900059991C /* IntViewController */,
124 | 320307A61CB88B900059991C /* StringViewController */,
125 | );
126 | path = ViewControllers;
127 | sourceTree = "";
128 | };
129 | 320307801CB855810059991C /* HomeViewController */ = {
130 | isa = PBXGroup;
131 | children = (
132 | 320307851CB855A70059991C /* HomeViewModel.swift */,
133 | 320307811CB8558C0059991C /* HomeViewController.swift */,
134 | 320307821CB8558C0059991C /* HomeViewController.xib */,
135 | );
136 | path = HomeViewController;
137 | sourceTree = "";
138 | };
139 | 3203078F1CB864DF0059991C /* IntCell */ = {
140 | isa = PBXGroup;
141 | children = (
142 | 320307991CB86AFB0059991C /* IntCellViewModel.swift */,
143 | 320307951CB8668B0059991C /* IntCell.swift */,
144 | 320307961CB8668B0059991C /* IntCell.xib */,
145 | );
146 | path = IntCell;
147 | sourceTree = "";
148 | };
149 | 320307901CB864DF0059991C /* StringCell */ = {
150 | isa = PBXGroup;
151 | children = (
152 | 3203079B1CB86B0B0059991C /* StringCellViewModel.swift */,
153 | 320307911CB8654B0059991C /* StringCell.swift */,
154 | 320307921CB8654B0059991C /* StringCell.xib */,
155 | );
156 | path = StringCell;
157 | sourceTree = "";
158 | };
159 | 320307A11CB885B30059991C /* Coordinators */ = {
160 | isa = PBXGroup;
161 | children = (
162 | 320307A21CB885BE0059991C /* Navigation */,
163 | );
164 | path = Coordinators;
165 | sourceTree = "";
166 | };
167 | 320307A21CB885BE0059991C /* Navigation */ = {
168 | isa = PBXGroup;
169 | children = (
170 | 320307A31CB885C90059991C /* NavigationCoordinator.swift */,
171 | );
172 | path = Navigation;
173 | sourceTree = "";
174 | };
175 | 320307A51CB88B900059991C /* IntViewController */ = {
176 | isa = PBXGroup;
177 | children = (
178 | 320307AB1CBAB8770059991C /* IntViewModel.swift */,
179 | 320307A71CBAB8630059991C /* IntViewController.swift */,
180 | 320307A81CBAB8630059991C /* IntViewController.xib */,
181 | );
182 | path = IntViewController;
183 | sourceTree = "";
184 | };
185 | 320307A61CB88B900059991C /* StringViewController */ = {
186 | isa = PBXGroup;
187 | children = (
188 | 320307B11CBAB8E50059991C /* StringViewModel.swift */,
189 | 320307AD1CBAB8920059991C /* StringViewController.swift */,
190 | 320307AE1CBAB8920059991C /* StringViewController.xib */,
191 | );
192 | path = StringViewController;
193 | sourceTree = "";
194 | };
195 | /* End PBXGroup section */
196 |
197 | /* Begin PBXNativeTarget section */
198 | 320307671CB854F70059991C /* CellRepresentable */ = {
199 | isa = PBXNativeTarget;
200 | buildConfigurationList = 3203077A1CB854F70059991C /* Build configuration list for PBXNativeTarget "CellRepresentable" */;
201 | buildPhases = (
202 | 320307641CB854F70059991C /* Sources */,
203 | 320307651CB854F70059991C /* Frameworks */,
204 | 320307661CB854F70059991C /* Resources */,
205 | );
206 | buildRules = (
207 | );
208 | dependencies = (
209 | );
210 | name = CellRepresentable;
211 | productName = CellRepresentable;
212 | productReference = 320307681CB854F70059991C /* CellRepresentable.app */;
213 | productType = "com.apple.product-type.application";
214 | };
215 | /* End PBXNativeTarget section */
216 |
217 | /* Begin PBXProject section */
218 | 320307601CB854F70059991C /* Project object */ = {
219 | isa = PBXProject;
220 | attributes = {
221 | LastSwiftUpdateCheck = 0720;
222 | LastUpgradeCheck = 0720;
223 | ORGANIZATIONNAME = Mustard;
224 | TargetAttributes = {
225 | 320307671CB854F70059991C = {
226 | CreatedOnToolsVersion = 7.2.1;
227 | };
228 | };
229 | };
230 | buildConfigurationList = 320307631CB854F70059991C /* Build configuration list for PBXProject "CellRepresentable" */;
231 | compatibilityVersion = "Xcode 3.2";
232 | developmentRegion = English;
233 | hasScannedForEncodings = 0;
234 | knownRegions = (
235 | en,
236 | Base,
237 | );
238 | mainGroup = 3203075F1CB854F70059991C;
239 | productRefGroup = 320307691CB854F70059991C /* Products */;
240 | projectDirPath = "";
241 | projectRoot = "";
242 | targets = (
243 | 320307671CB854F70059991C /* CellRepresentable */,
244 | );
245 | };
246 | /* End PBXProject section */
247 |
248 | /* Begin PBXResourcesBuildPhase section */
249 | 320307661CB854F70059991C /* Resources */ = {
250 | isa = PBXResourcesBuildPhase;
251 | buildActionMask = 2147483647;
252 | files = (
253 | 320307981CB8668B0059991C /* IntCell.xib in Resources */,
254 | 320307761CB854F70059991C /* LaunchScreen.storyboard in Resources */,
255 | 320307AA1CBAB8630059991C /* IntViewController.xib in Resources */,
256 | 320307731CB854F70059991C /* Assets.xcassets in Resources */,
257 | 320307941CB8654B0059991C /* StringCell.xib in Resources */,
258 | 320307841CB8558C0059991C /* HomeViewController.xib in Resources */,
259 | 320307B01CBAB8920059991C /* StringViewController.xib in Resources */,
260 | );
261 | runOnlyForDeploymentPostprocessing = 0;
262 | };
263 | /* End PBXResourcesBuildPhase section */
264 |
265 | /* Begin PBXSourcesBuildPhase section */
266 | 320307641CB854F70059991C /* Sources */ = {
267 | isa = PBXSourcesBuildPhase;
268 | buildActionMask = 2147483647;
269 | files = (
270 | 320307A91CBAB8630059991C /* IntViewController.swift in Sources */,
271 | 3203079A1CB86AFB0059991C /* IntCellViewModel.swift in Sources */,
272 | 3203076C1CB854F70059991C /* AppDelegate.swift in Sources */,
273 | 320307861CB855A70059991C /* HomeViewModel.swift in Sources */,
274 | 320307AF1CBAB8920059991C /* StringViewController.swift in Sources */,
275 | 320307AC1CBAB8770059991C /* IntViewModel.swift in Sources */,
276 | 3203079E1CB86E670059991C /* Helpers.swift in Sources */,
277 | 320307B21CBAB8E50059991C /* StringViewModel.swift in Sources */,
278 | 320307A41CB885C90059991C /* NavigationCoordinator.swift in Sources */,
279 | 320307931CB8654B0059991C /* StringCell.swift in Sources */,
280 | 320307971CB8668B0059991C /* IntCell.swift in Sources */,
281 | 320307881CB855C90059991C /* CellRepresentable.swift in Sources */,
282 | 320307831CB8558C0059991C /* HomeViewController.swift in Sources */,
283 | 3203079C1CB86B0B0059991C /* StringCellViewModel.swift in Sources */,
284 | );
285 | runOnlyForDeploymentPostprocessing = 0;
286 | };
287 | /* End PBXSourcesBuildPhase section */
288 |
289 | /* Begin PBXVariantGroup section */
290 | 320307741CB854F70059991C /* LaunchScreen.storyboard */ = {
291 | isa = PBXVariantGroup;
292 | children = (
293 | 320307751CB854F70059991C /* Base */,
294 | );
295 | name = LaunchScreen.storyboard;
296 | sourceTree = "";
297 | };
298 | /* End PBXVariantGroup section */
299 |
300 | /* Begin XCBuildConfiguration section */
301 | 320307781CB854F70059991C /* Debug */ = {
302 | isa = XCBuildConfiguration;
303 | buildSettings = {
304 | ALWAYS_SEARCH_USER_PATHS = NO;
305 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
306 | CLANG_CXX_LIBRARY = "libc++";
307 | CLANG_ENABLE_MODULES = YES;
308 | CLANG_ENABLE_OBJC_ARC = YES;
309 | CLANG_WARN_BOOL_CONVERSION = YES;
310 | CLANG_WARN_CONSTANT_CONVERSION = YES;
311 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
312 | CLANG_WARN_EMPTY_BODY = YES;
313 | CLANG_WARN_ENUM_CONVERSION = YES;
314 | CLANG_WARN_INT_CONVERSION = YES;
315 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
316 | CLANG_WARN_UNREACHABLE_CODE = YES;
317 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
318 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
319 | COPY_PHASE_STRIP = NO;
320 | DEBUG_INFORMATION_FORMAT = dwarf;
321 | ENABLE_STRICT_OBJC_MSGSEND = YES;
322 | ENABLE_TESTABILITY = YES;
323 | GCC_C_LANGUAGE_STANDARD = gnu99;
324 | GCC_DYNAMIC_NO_PIC = NO;
325 | GCC_NO_COMMON_BLOCKS = YES;
326 | GCC_OPTIMIZATION_LEVEL = 0;
327 | GCC_PREPROCESSOR_DEFINITIONS = (
328 | "DEBUG=1",
329 | "$(inherited)",
330 | );
331 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
332 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
333 | GCC_WARN_UNDECLARED_SELECTOR = YES;
334 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
335 | GCC_WARN_UNUSED_FUNCTION = YES;
336 | GCC_WARN_UNUSED_VARIABLE = YES;
337 | IPHONEOS_DEPLOYMENT_TARGET = 9.2;
338 | MTL_ENABLE_DEBUG_INFO = YES;
339 | ONLY_ACTIVE_ARCH = YES;
340 | SDKROOT = iphoneos;
341 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
342 | };
343 | name = Debug;
344 | };
345 | 320307791CB854F70059991C /* Release */ = {
346 | isa = XCBuildConfiguration;
347 | buildSettings = {
348 | ALWAYS_SEARCH_USER_PATHS = NO;
349 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
350 | CLANG_CXX_LIBRARY = "libc++";
351 | CLANG_ENABLE_MODULES = YES;
352 | CLANG_ENABLE_OBJC_ARC = YES;
353 | CLANG_WARN_BOOL_CONVERSION = YES;
354 | CLANG_WARN_CONSTANT_CONVERSION = YES;
355 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
356 | CLANG_WARN_EMPTY_BODY = YES;
357 | CLANG_WARN_ENUM_CONVERSION = YES;
358 | CLANG_WARN_INT_CONVERSION = YES;
359 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
360 | CLANG_WARN_UNREACHABLE_CODE = YES;
361 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
362 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
363 | COPY_PHASE_STRIP = NO;
364 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
365 | ENABLE_NS_ASSERTIONS = NO;
366 | ENABLE_STRICT_OBJC_MSGSEND = YES;
367 | GCC_C_LANGUAGE_STANDARD = gnu99;
368 | GCC_NO_COMMON_BLOCKS = YES;
369 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
370 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
371 | GCC_WARN_UNDECLARED_SELECTOR = YES;
372 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
373 | GCC_WARN_UNUSED_FUNCTION = YES;
374 | GCC_WARN_UNUSED_VARIABLE = YES;
375 | IPHONEOS_DEPLOYMENT_TARGET = 9.2;
376 | MTL_ENABLE_DEBUG_INFO = NO;
377 | SDKROOT = iphoneos;
378 | VALIDATE_PRODUCT = YES;
379 | };
380 | name = Release;
381 | };
382 | 3203077B1CB854F70059991C /* Debug */ = {
383 | isa = XCBuildConfiguration;
384 | buildSettings = {
385 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
386 | INFOPLIST_FILE = CellRepresentable/Info.plist;
387 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
388 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
389 | PRODUCT_BUNDLE_IDENTIFIER = com.mustard.CellRepresentable;
390 | PRODUCT_NAME = "$(TARGET_NAME)";
391 | };
392 | name = Debug;
393 | };
394 | 3203077C1CB854F70059991C /* Release */ = {
395 | isa = XCBuildConfiguration;
396 | buildSettings = {
397 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
398 | INFOPLIST_FILE = CellRepresentable/Info.plist;
399 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
400 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
401 | PRODUCT_BUNDLE_IDENTIFIER = com.mustard.CellRepresentable;
402 | PRODUCT_NAME = "$(TARGET_NAME)";
403 | };
404 | name = Release;
405 | };
406 | /* End XCBuildConfiguration section */
407 |
408 | /* Begin XCConfigurationList section */
409 | 320307631CB854F70059991C /* Build configuration list for PBXProject "CellRepresentable" */ = {
410 | isa = XCConfigurationList;
411 | buildConfigurations = (
412 | 320307781CB854F70059991C /* Debug */,
413 | 320307791CB854F70059991C /* Release */,
414 | );
415 | defaultConfigurationIsVisible = 0;
416 | defaultConfigurationName = Release;
417 | };
418 | 3203077A1CB854F70059991C /* Build configuration list for PBXNativeTarget "CellRepresentable" */ = {
419 | isa = XCConfigurationList;
420 | buildConfigurations = (
421 | 3203077B1CB854F70059991C /* Debug */,
422 | 3203077C1CB854F70059991C /* Release */,
423 | );
424 | defaultConfigurationIsVisible = 0;
425 | };
426 | /* End XCConfigurationList section */
427 | };
428 | rootObject = 320307601CB854F70059991C /* Project object */;
429 | }
430 |
--------------------------------------------------------------------------------