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