├── MVVM ├── MVVMAfter │ ├── MVVMAfter.xcodeproj │ │ ├── project.xcworkspace │ │ │ └── contents.xcworkspacedata │ │ └── project.pbxproj │ ├── MVVMAfterTests │ │ ├── Info.plist │ │ └── MVVMAfterTests.swift │ └── MVVMAfter │ │ ├── DataStore.swift │ │ ├── FolderData.swift │ │ ├── Images.xcassets │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ │ ├── Info.plist │ │ ├── ShowViewController.swift │ │ ├── ChangeFolderNameViewController.swift │ │ ├── AppDelegate.swift │ │ ├── FolderViewModel.swift │ │ └── Base.lproj │ │ ├── LaunchScreen.xib │ │ └── Main.storyboard └── MVVMBefore │ ├── MVVMBefore.xcodeproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ └── project.pbxproj │ ├── MVVMBeforeTests │ ├── Info.plist │ └── MVVMBeforeTests.swift │ └── MVVMBefore │ ├── DataStore.swift │ ├── FolderData.swift │ ├── Images.xcassets │ └── AppIcon.appiconset │ │ └── Contents.json │ ├── Info.plist │ ├── AppDelegate.swift │ ├── ShowViewController.swift │ ├── ChangeFolderNameViewController.swift │ └── Base.lproj │ ├── LaunchScreen.xib │ └── Main.storyboard ├── Data Source ├── DataSourceAfter │ ├── DataSourceAfter.xcodeproj │ │ ├── project.xcworkspace │ │ │ └── contents.xcworkspacedata │ │ └── project.pbxproj │ ├── DataSourceAfter │ │ ├── ItemViewCell.swift │ │ ├── SectionHeaderViewCell.swift │ │ ├── Model.swift │ │ ├── Images.xcassets │ │ │ └── AppIcon.appiconset │ │ │ │ └── Contents.json │ │ ├── Info.plist │ │ ├── ViewController.swift │ │ ├── AppDelegate.swift │ │ └── Base.lproj │ │ │ ├── LaunchScreen.xib │ │ │ └── Main.storyboard │ ├── DataSourceAfterTests │ │ ├── Info.plist │ │ └── DataSourceAfterTests.swift │ └── ItemsDataSource.swift └── DataSourceBefore │ ├── DataSourceBefore.xcodeproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ └── project.pbxproj │ ├── DataSourceBefore │ ├── ItemViewCell.swift │ ├── SectionHeaderViewCell.swift │ ├── Model.swift │ ├── Images.xcassets │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── Info.plist │ ├── AppDelegate.swift │ ├── ViewController.swift │ └── Base.lproj │ │ ├── LaunchScreen.xib │ │ └── Main.storyboard │ └── DataSourceBeforeTests │ ├── Info.plist │ └── DataSourceBeforeTests.swift ├── README.md └── LICENSE /MVVM/MVVMAfter/MVVMAfter.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /MVVM/MVVMBefore/MVVMBefore.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Data Source/DataSourceAfter/DataSourceAfter.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Data Source/DataSourceBefore/DataSourceBefore.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Massive View Controller 2 | 3 | Sample code for a series of blog posts about MVC on iOS and OSX applications and how to refactor them to keep them sane. 4 | 5 | - [Refactoring data source into external class](http://gentlebytes.com/blog/2015/01/30/massive-view-controller/). 6 | - [Introducing view models](http://gentlebytes.com/blog/2015/02/20/massive-view-controller-mvvm/) 7 | -------------------------------------------------------------------------------- /Data Source/DataSourceAfter/DataSourceAfter/ItemViewCell.swift: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Created by Tomaz Kragelj on 31.01.2015. 4 | Copyright (c) 2015 Gentle Bytes. 5 | 6 | */ 7 | 8 | import UIKit 9 | 10 | class ItemViewCell: UICollectionViewCell { 11 | 12 | func configureWithItem(item: ItemData, section: SectionData) { 13 | self.titleLabel.text = "\(item.title) of \(section.title)" 14 | } 15 | 16 | @IBOutlet var titleLabel: UILabel! 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Data Source/DataSourceBefore/DataSourceBefore/ItemViewCell.swift: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Created by Tomaz Kragelj on 31.01.2015. 4 | Copyright (c) 2015 Gentle Bytes. 5 | 6 | */ 7 | 8 | import UIKit 9 | 10 | class ItemViewCell: UICollectionViewCell { 11 | 12 | func configureWithItem(item: ItemData, section: SectionData) { 13 | self.titleLabel.text = "\(item.title) of \(section.title)" 14 | } 15 | 16 | @IBOutlet var titleLabel: UILabel! 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Data Source/DataSourceAfter/DataSourceAfter/SectionHeaderViewCell.swift: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Created by Tomaz Kragelj on 31.01.2015. 4 | Copyright (c) 2015 Gentle Bytes. 5 | 6 | */ 7 | 8 | import UIKit 9 | 10 | class SectionHeaderViewCell: UICollectionReusableView { 11 | 12 | func configureWithSection(section: SectionData) { 13 | self.titleLabel.text = section.title 14 | self.countLabel.text = NSLocalizedString("\(section.items.count) items", comment: "") 15 | } 16 | 17 | @IBOutlet var titleLabel: UILabel! 18 | @IBOutlet var countLabel: UILabel! 19 | 20 | } 21 | -------------------------------------------------------------------------------- /Data Source/DataSourceBefore/DataSourceBefore/SectionHeaderViewCell.swift: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Created by Tomaz Kragelj on 31.01.2015. 4 | Copyright (c) 2015 Gentle Bytes. 5 | 6 | */ 7 | 8 | import UIKit 9 | 10 | class SectionHeaderViewCell: UICollectionReusableView { 11 | 12 | func configureWithSection(section: SectionData) { 13 | self.titleLabel.text = section.title 14 | self.countLabel.text = NSLocalizedString("\(section.items.count) items", comment: "") 15 | } 16 | 17 | @IBOutlet var titleLabel: UILabel! 18 | @IBOutlet var countLabel: UILabel! 19 | 20 | } 21 | -------------------------------------------------------------------------------- /MVVM/MVVMAfter/MVVMAfterTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | com.gentlebytes.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /MVVM/MVVMBefore/MVVMBeforeTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | com.gentlebytes.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /Data Source/DataSourceAfter/DataSourceAfterTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | com.gentlebytes.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /Data Source/DataSourceBefore/DataSourceBeforeTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | com.gentlebytes.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /MVVM/MVVMAfter/MVVMAfterTests/MVVMAfterTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MVVMAfterTests.swift 3 | // MVVMAfterTests 4 | // 5 | // Created by Tomaz Kragelj on 20.02.15. 6 | // Copyright (c) 2015 Gentle Bytes. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import XCTest 11 | 12 | class MVVMAfterTests: XCTestCase { 13 | 14 | override func setUp() { 15 | super.setUp() 16 | // Put setup code here. This method is called before the invocation of each test method in the class. 17 | } 18 | 19 | override func tearDown() { 20 | // Put teardown code here. This method is called after the invocation of each test method in the class. 21 | super.tearDown() 22 | } 23 | 24 | func testExample() { 25 | // This is an example of a functional test case. 26 | XCTAssert(true, "Pass") 27 | } 28 | 29 | func testPerformanceExample() { 30 | // This is an example of a performance test case. 31 | self.measureBlock() { 32 | // Put the code you want to measure the time of here. 33 | } 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /MVVM/MVVMBefore/MVVMBeforeTests/MVVMBeforeTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MVVMBeforeTests.swift 3 | // MVVMBeforeTests 4 | // 5 | // Created by Tomaz Kragelj on 19.02.15. 6 | // Copyright (c) 2015 Gentle Bytes. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import XCTest 11 | 12 | class MVVMBeforeTests: XCTestCase { 13 | 14 | override func setUp() { 15 | super.setUp() 16 | // Put setup code here. This method is called before the invocation of each test method in the class. 17 | } 18 | 19 | override func tearDown() { 20 | // Put teardown code here. This method is called after the invocation of each test method in the class. 21 | super.tearDown() 22 | } 23 | 24 | func testExample() { 25 | // This is an example of a functional test case. 26 | XCTAssert(true, "Pass") 27 | } 28 | 29 | func testPerformanceExample() { 30 | // This is an example of a performance test case. 31 | self.measureBlock() { 32 | // Put the code you want to measure the time of here. 33 | } 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /MVVM/MVVMAfter/MVVMAfter/DataStore.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | /** This is where we get FolderData from. 4 | */ 5 | class DataStore { 6 | 7 | class var sharedInstance: DataStore { 8 | struct Static { 9 | static var token: dispatch_once_t = 0 10 | static var instance: DataStore? = nil 11 | } 12 | 13 | dispatch_once(&Static.token) { 14 | Static.instance = DataStore() 15 | } 16 | 17 | return Static.instance! 18 | } 19 | 20 | func folderDataForPath(path: String) -> FolderData { 21 | // Note we're caching folders by their paths so next request for the same folder would return previous FolderData instance. 22 | if let existingFolder = self.foldersByPaths[path] { 23 | return existingFolder 24 | } 25 | 26 | // Prepare folder data for given path. 27 | let result = FolderData() 28 | result.name = path.lastPathComponent 29 | result.size = 0 30 | 31 | // Add folder to our cache. 32 | self.foldersByPaths[path] = result 33 | 34 | // Return newly created instance. 35 | return result 36 | } 37 | 38 | private lazy var foldersByPaths = [String:FolderData]() 39 | 40 | } 41 | -------------------------------------------------------------------------------- /MVVM/MVVMBefore/MVVMBefore/DataStore.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | /** This is where we get FolderData from. 4 | */ 5 | class DataStore { 6 | 7 | class var sharedInstance: DataStore { 8 | struct Static { 9 | static var token: dispatch_once_t = 0 10 | static var instance: DataStore? = nil 11 | } 12 | 13 | dispatch_once(&Static.token) { 14 | Static.instance = DataStore() 15 | } 16 | 17 | return Static.instance! 18 | } 19 | 20 | func folderDataForPath(path: String) -> FolderData { 21 | // Note we're caching folders by their paths so next request for the same folder would return previous FolderData instance. 22 | if let existingFolder = self.foldersByPaths[path] { 23 | return existingFolder 24 | } 25 | 26 | // Prepare folder data for given path. 27 | let result = FolderData() 28 | result.name = path.lastPathComponent 29 | result.size = 0 30 | 31 | // Add folder to our cache. 32 | self.foldersByPaths[path] = result 33 | 34 | // Return newly created instance. 35 | return result 36 | } 37 | 38 | private lazy var foldersByPaths = [String:FolderData]() 39 | 40 | } 41 | -------------------------------------------------------------------------------- /Data Source/DataSourceAfter/DataSourceAfterTests/DataSourceAfterTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DataSourceAfterTests.swift 3 | // DataSourceAfterTests 4 | // 5 | // Created by Tomaz Kragelj on 31.01.15. 6 | // Copyright (c) 2015 Gentle Bytes. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import XCTest 11 | 12 | class DataSourceAfterTests: XCTestCase { 13 | 14 | override func setUp() { 15 | super.setUp() 16 | // Put setup code here. This method is called before the invocation of each test method in the class. 17 | } 18 | 19 | override func tearDown() { 20 | // Put teardown code here. This method is called after the invocation of each test method in the class. 21 | super.tearDown() 22 | } 23 | 24 | func testExample() { 25 | // This is an example of a functional test case. 26 | XCTAssert(true, "Pass") 27 | } 28 | 29 | func testPerformanceExample() { 30 | // This is an example of a performance test case. 31 | self.measureBlock() { 32 | // Put the code you want to measure the time of here. 33 | } 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /Data Source/DataSourceBefore/DataSourceBeforeTests/DataSourceBeforeTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DataSourceBeforeTests.swift 3 | // DataSourceBeforeTests 4 | // 5 | // Created by Tomaz Kragelj on 31.01.15. 6 | // Copyright (c) 2015 Gentle Bytes. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import XCTest 11 | 12 | class DataSourceBeforeTests: XCTestCase { 13 | 14 | override func setUp() { 15 | super.setUp() 16 | // Put setup code here. This method is called before the invocation of each test method in the class. 17 | } 18 | 19 | override func tearDown() { 20 | // Put teardown code here. This method is called after the invocation of each test method in the class. 21 | super.tearDown() 22 | } 23 | 24 | func testExample() { 25 | // This is an example of a functional test case. 26 | XCTAssert(true, "Pass") 27 | } 28 | 29 | func testPerformanceExample() { 30 | // This is an example of a performance test case. 31 | self.measureBlock() { 32 | // Put the code you want to measure the time of here. 33 | } 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 tomaz 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /MVVM/MVVMAfter/MVVMAfter/FolderData.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | class FolderData: NSObject { 4 | 5 | override init() { 6 | self.name = "" 7 | self.size = 0 8 | self.simulateSizeChanges = true 9 | 10 | super.init() 11 | } 12 | 13 | dynamic var name: String { 14 | willSet { 15 | println("FolderData: Changing \(self.name) -> \(newValue)") 16 | } 17 | } 18 | 19 | dynamic var size: Int { 20 | willSet { 21 | println("FolderData: Changing \(self.name) size \(self.size) -> \(newValue)") 22 | } 23 | } 24 | 25 | // MARK: - Real folder simulation... 26 | 27 | var simulateSizeChanges: Bool { 28 | willSet { 29 | if (newValue) { 30 | if self.timer != nil { 31 | self.timer.invalidate() 32 | } 33 | 34 | self.timer = NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: "simulateSizeTimerTick", userInfo: nil, repeats: true) 35 | } else { 36 | self.timer.invalidate() 37 | self.timer = nil 38 | } 39 | } 40 | } 41 | 42 | func simulateSizeTimerTick() { 43 | println("--> FolderData: simulating size increase") 44 | self.size += 1024 45 | } 46 | 47 | private var timer: NSTimer! 48 | 49 | } 50 | -------------------------------------------------------------------------------- /MVVM/MVVMBefore/MVVMBefore/FolderData.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | class FolderData: NSObject { 4 | 5 | override init() { 6 | self.name = "" 7 | self.size = 0 8 | self.simulateSizeChanges = true 9 | 10 | super.init() 11 | } 12 | 13 | dynamic var name: String { 14 | willSet { 15 | println("FolderData: Changing \(self.name) -> \(newValue)") 16 | } 17 | } 18 | 19 | dynamic var size: Int { 20 | willSet { 21 | println("FolderData: Changing \(self.name) size \(self.size) -> \(newValue)") 22 | } 23 | } 24 | 25 | // MARK: - Real folder simulation... 26 | 27 | var simulateSizeChanges: Bool { 28 | willSet { 29 | if (newValue) { 30 | if self.timer != nil { 31 | self.timer.invalidate() 32 | } 33 | 34 | self.timer = NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: "simulateSizeTimerTick", userInfo: nil, repeats: true) 35 | } else { 36 | self.timer.invalidate() 37 | self.timer = nil 38 | } 39 | } 40 | } 41 | 42 | func simulateSizeTimerTick() { 43 | println("--> FolderData: simulating size increase") 44 | self.size += 1024 45 | } 46 | 47 | private var timer: NSTimer! 48 | 49 | } 50 | -------------------------------------------------------------------------------- /Data Source/DataSourceAfter/DataSourceAfter/Model.swift: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Created by Tomaz Kragelj on 31.01.2015. 4 | Copyright (c) 2015 Gentle Bytes. 5 | 6 | */ 7 | 8 | import Foundation 9 | 10 | class SectionData { 11 | init(title: String, items: [ItemData]) { 12 | self.title = title 13 | self.items = items 14 | } 15 | 16 | lazy var title = "" 17 | lazy var items = [ItemData]() 18 | } 19 | 20 | class ItemData { 21 | init(title: String) { 22 | self.title = title 23 | } 24 | 25 | lazy var title = "" 26 | } 27 | 28 | func testSections() -> [SectionData] { 29 | return [ 30 | SectionData(title: "Section 1", items: [ 31 | ItemData(title: "Item 1"), 32 | ItemData(title: "Item 2"), 33 | ItemData(title: "Item 3"), 34 | ]), 35 | 36 | SectionData(title: "Section 2", items: [ 37 | ItemData(title: "Item 1"), 38 | ItemData(title: "Item 2"), 39 | ItemData(title: "Item 3"), 40 | ItemData(title: "Item 4"), 41 | ItemData(title: "Item 5"), 42 | ItemData(title: "Item 6"), 43 | ItemData(title: "Item 7"), 44 | ]), 45 | 46 | SectionData(title: "Section 3", items: [ 47 | ItemData(title: "Item 1"), 48 | ItemData(title: "Item 2"), 49 | ]), 50 | ] 51 | } -------------------------------------------------------------------------------- /Data Source/DataSourceBefore/DataSourceBefore/Model.swift: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Created by Tomaz Kragelj on 31.01.2015. 4 | Copyright (c) 2015 Gentle Bytes. 5 | 6 | */ 7 | 8 | import Foundation 9 | 10 | class SectionData { 11 | init(title: String, items: [ItemData]) { 12 | self.title = title 13 | self.items = items 14 | } 15 | 16 | lazy var title = "" 17 | lazy var items = [ItemData]() 18 | } 19 | 20 | class ItemData { 21 | init(title: String) { 22 | self.title = title 23 | } 24 | 25 | lazy var title = "" 26 | } 27 | 28 | func testSections() -> [SectionData] { 29 | return [ 30 | SectionData(title: "Section 1", items: [ 31 | ItemData(title: "Item 1"), 32 | ItemData(title: "Item 2"), 33 | ItemData(title: "Item 3"), 34 | ]), 35 | 36 | SectionData(title: "Section 2", items: [ 37 | ItemData(title: "Item 1"), 38 | ItemData(title: "Item 2"), 39 | ItemData(title: "Item 3"), 40 | ItemData(title: "Item 4"), 41 | ItemData(title: "Item 5"), 42 | ItemData(title: "Item 6"), 43 | ItemData(title: "Item 7"), 44 | ]), 45 | 46 | SectionData(title: "Section 3", items: [ 47 | ItemData(title: "Item 1"), 48 | ItemData(title: "Item 2"), 49 | ]), 50 | ] 51 | } -------------------------------------------------------------------------------- /MVVM/MVVMAfter/MVVMAfter/Images.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 | "idiom" : "ipad", 35 | "size" : "29x29", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "idiom" : "ipad", 40 | "size" : "29x29", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "40x40", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "40x40", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "76x76", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "76x76", 61 | "scale" : "2x" 62 | } 63 | ], 64 | "info" : { 65 | "version" : 1, 66 | "author" : "xcode" 67 | } 68 | } -------------------------------------------------------------------------------- /MVVM/MVVMBefore/MVVMBefore/Images.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 | "idiom" : "ipad", 35 | "size" : "29x29", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "idiom" : "ipad", 40 | "size" : "29x29", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "40x40", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "40x40", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "76x76", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "76x76", 61 | "scale" : "2x" 62 | } 63 | ], 64 | "info" : { 65 | "version" : 1, 66 | "author" : "xcode" 67 | } 68 | } -------------------------------------------------------------------------------- /Data Source/DataSourceAfter/DataSourceAfter/Images.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 | "idiom" : "ipad", 35 | "size" : "29x29", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "idiom" : "ipad", 40 | "size" : "29x29", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "40x40", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "40x40", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "76x76", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "76x76", 61 | "scale" : "2x" 62 | } 63 | ], 64 | "info" : { 65 | "version" : 1, 66 | "author" : "xcode" 67 | } 68 | } -------------------------------------------------------------------------------- /Data Source/DataSourceBefore/DataSourceBefore/Images.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 | "idiom" : "ipad", 35 | "size" : "29x29", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "idiom" : "ipad", 40 | "size" : "29x29", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "40x40", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "40x40", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "76x76", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "76x76", 61 | "scale" : "2x" 62 | } 63 | ], 64 | "info" : { 65 | "version" : 1, 66 | "author" : "xcode" 67 | } 68 | } -------------------------------------------------------------------------------- /MVVM/MVVMAfter/MVVMAfter/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | com.gentlebytes.$(PRODUCT_NAME:rfc1034identifier) 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 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | UIInterfaceOrientationLandscapeRight 38 | 39 | UISupportedInterfaceOrientations~ipad 40 | 41 | UIInterfaceOrientationPortrait 42 | UIInterfaceOrientationPortraitUpsideDown 43 | UIInterfaceOrientationLandscapeLeft 44 | UIInterfaceOrientationLandscapeRight 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /MVVM/MVVMBefore/MVVMBefore/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | com.gentlebytes.$(PRODUCT_NAME:rfc1034identifier) 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 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | UIInterfaceOrientationLandscapeRight 38 | 39 | UISupportedInterfaceOrientations~ipad 40 | 41 | UIInterfaceOrientationPortrait 42 | UIInterfaceOrientationPortraitUpsideDown 43 | UIInterfaceOrientationLandscapeLeft 44 | UIInterfaceOrientationLandscapeRight 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /Data Source/DataSourceAfter/DataSourceAfter/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | com.gentlebytes.$(PRODUCT_NAME:rfc1034identifier) 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 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | UIInterfaceOrientationLandscapeRight 38 | 39 | UISupportedInterfaceOrientations~ipad 40 | 41 | UIInterfaceOrientationPortrait 42 | UIInterfaceOrientationPortraitUpsideDown 43 | UIInterfaceOrientationLandscapeLeft 44 | UIInterfaceOrientationLandscapeRight 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /Data Source/DataSourceBefore/DataSourceBefore/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | com.gentlebytes.$(PRODUCT_NAME:rfc1034identifier) 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 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | UIInterfaceOrientationLandscapeRight 38 | 39 | UISupportedInterfaceOrientations~ipad 40 | 41 | UIInterfaceOrientationPortrait 42 | UIInterfaceOrientationPortraitUpsideDown 43 | UIInterfaceOrientationLandscapeLeft 44 | UIInterfaceOrientationLandscapeRight 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /MVVM/MVVMAfter/MVVMAfter/ShowViewController.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | class ShowViewController: UIViewController { 4 | 5 | // MARK: - Overriden methods 6 | 7 | override func viewDidLoad() { 8 | super.viewDidLoad() 9 | 10 | // Establish our view model. 11 | self.viewModel = FolderViewModel(folder: self.folder) 12 | 13 | // Update our views with current data. 14 | self.updateUserInterface() 15 | 16 | // When folder's name or size changes, update our views. 17 | self.viewModel.nameOrSizeDidChange = { 18 | println("ShowViewController: folder name changed") 19 | self.updateUserInterface() 20 | } 21 | } 22 | 23 | override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 24 | if segue.identifier == "ChangeFolderNameScene" { 25 | // When change name view controller is instructed, pass it our folder. 26 | let destinationViewController = segue.destinationViewController as! ChangeFolderNameViewController 27 | destinationViewController.folder = self.folder 28 | } 29 | } 30 | 31 | // MARK: - User actions 32 | 33 | @IBAction func toggleFolderSizeChangeSimulation(sender: UISwitch) { 34 | println("ShowViewController: toggling folder size change simulation") 35 | self.folder.simulateSizeChanges = sender.on 36 | } 37 | 38 | // MARK: - Helper methods 39 | 40 | private func updateUserInterface() { 41 | println("ShowViewController: updating user interface") 42 | self.folderInfoLabel.text = self.viewModel.nameAndSizeDescription 43 | } 44 | 45 | // MARK: - Properties 46 | 47 | private var viewModel: FolderViewModel! 48 | 49 | private lazy var folder = DataStore.sharedInstance.folderDataForPath("/Some/Folder/Name") 50 | 51 | @IBOutlet weak var folderInfoLabel: UILabel! 52 | 53 | } 54 | -------------------------------------------------------------------------------- /Data Source/DataSourceAfter/ItemsDataSource.swift: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Created by Tomaz Kragelj on 31.01.2015. 4 | Copyright (c) 2015 Gentle Bytes. 5 | 6 | */ 7 | 8 | import UIKit 9 | 10 | class ItemsDataSource: NSObject, UICollectionViewDataSource { 11 | 12 | init(collectionView: UICollectionView) { 13 | self.sections = testSections() 14 | self.collectionView = collectionView 15 | 16 | super.init() 17 | } 18 | 19 | // MARK: - UICollectionViewDataSource implementation 20 | 21 | func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { 22 | return self.sections.count 23 | } 24 | 25 | func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 26 | let sectionData = self.sections[section] 27 | return sectionData.items.count 28 | } 29 | 30 | func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView { 31 | let sectionData = self.sections[indexPath.section] 32 | 33 | let result = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "SectionCell", forIndexPath: indexPath) as SectionHeaderViewCell 34 | result.configureWithSection(sectionData) 35 | return result; 36 | } 37 | 38 | func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 39 | let sectionData = self.sections[indexPath.section] 40 | let itemData = sectionData.items[indexPath.item] 41 | 42 | let result = collectionView.dequeueReusableCellWithReuseIdentifier("ItemCell", forIndexPath: indexPath) as ItemViewCell 43 | result.configureWithItem(itemData, section: sectionData) 44 | return result 45 | } 46 | 47 | // MARK: - Properties 48 | 49 | private (set) internal var sections: [SectionData] 50 | private var collectionView: UICollectionView 51 | 52 | } 53 | -------------------------------------------------------------------------------- /Data Source/DataSourceAfter/DataSourceAfter/ViewController.swift: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Created by Tomaz Kragelj on 31.01.2015. 4 | Copyright (c) 2015 Gentle Bytes. 5 | 6 | */ 7 | 8 | import UIKit 9 | 10 | class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout { 11 | 12 | override func viewDidLoad() { 13 | super.viewDidLoad() 14 | 15 | self.dataSource = ItemsDataSource(collectionView: self.collectionView) 16 | 17 | self.collectionView.dataSource = self.dataSource 18 | } 19 | 20 | // MARK: - UICollectionViewDelegate implementation 21 | 22 | func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { 23 | let sectionData = self.dataSource.sections[indexPath.section] 24 | let itemData = sectionData.items[indexPath.item] 25 | 26 | let title = NSLocalizedString("Wonderful!", comment: "") 27 | let message = NSLocalizedString("You just selected \(itemData.title) of \(sectionData.title)! That's a great choice!", comment: "") 28 | let button = NSLocalizedString("I know", comment: "") 29 | 30 | let controller = UIAlertController(title: title, message: message, preferredStyle: .Alert) 31 | controller.addAction(UIAlertAction(title: button, style: .Default, handler: nil)) 32 | 33 | self.presentViewController(controller, animated: true, completion: nil) 34 | } 35 | 36 | // MARK: - UICollectionViewDelegateFlowLayout implementatio 37 | 38 | func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { 39 | let layout = collectionViewLayout as UICollectionViewFlowLayout 40 | return CGSizeMake(CGRectGetWidth(collectionView.frame), layout.itemSize.height) 41 | } 42 | 43 | // MARK: - Properties 44 | 45 | private var dataSource: ItemsDataSource! 46 | 47 | @IBOutlet var collectionView: UICollectionView! 48 | 49 | } 50 | 51 | -------------------------------------------------------------------------------- /MVVM/MVVMAfter/MVVMAfter/ChangeFolderNameViewController.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | class ChangeFolderNameViewController: UIViewController, UITextFieldDelegate { 4 | 5 | // MARK: - Overriden methods 6 | 7 | override func viewDidLoad() { 8 | super.viewDidLoad() 9 | 10 | // Assign name to text field. Note we could also use self.viewModel.folder.name... 11 | self.nameTextField.text = self.folder.name 12 | 13 | // Update info label. 14 | self.updateUserInterface() 15 | } 16 | 17 | // MARK: - Helper methods 18 | 19 | private func updateUserInterface() { 20 | println("ChangeFolderNameViewController: updating user interface") 21 | self.infoLabel.text = self.viewModel.nameAndSizeDescription 22 | } 23 | 24 | // MARK: - UITextFieldDelegate implementation 25 | 26 | func textFieldDidEndEditing(textField: UITextField) { 27 | // Store new name to FolderData when text field ends editing. Note we could also use self.viewModel.folder.name = ... 28 | println("--> ChangeFolderNameViewController: changing name to \(self.nameTextField.text)") 29 | self.folder.name = self.nameTextField.text 30 | } 31 | 32 | func textFieldShouldReturn(textField: UITextField) -> Bool { 33 | // Hide keyboard when done button is pressed. 34 | textField.resignFirstResponder() 35 | return false 36 | } 37 | 38 | // MARK: - Properties 39 | 40 | var viewModel: FolderViewModel! 41 | 42 | var folder: FolderData! { 43 | didSet { 44 | println("ChangeFolderNameViewController: folder changed, preparing new view model") 45 | 46 | // When folder changes, prepare new view model. 47 | self.viewModel = FolderViewModel(folder: self.folder) 48 | 49 | // Setup observations. 50 | self.viewModel.nameOrSizeDidChange = { 51 | println("ChangeFolderNameViewController: name or size changed") 52 | self.updateUserInterface() 53 | } 54 | } 55 | } 56 | 57 | @IBOutlet weak var nameTextField: UITextField! 58 | @IBOutlet weak var infoLabel: UILabel! 59 | 60 | } 61 | -------------------------------------------------------------------------------- /Data Source/DataSourceAfter/DataSourceAfter/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Created by Tomaz Kragelj on 31.01.2015. 4 | Copyright (c) 2015 Gentle Bytes. 5 | 6 | */ 7 | 8 | import UIKit 9 | 10 | @UIApplicationMain 11 | class AppDelegate: UIResponder, UIApplicationDelegate { 12 | 13 | var window: UIWindow? 14 | 15 | 16 | func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 17 | // Override point for customization after application launch. 18 | return true 19 | } 20 | 21 | func applicationWillResignActive(application: UIApplication) { 22 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 23 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 24 | } 25 | 26 | func applicationDidEnterBackground(application: UIApplication) { 27 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 28 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 29 | } 30 | 31 | func applicationWillEnterForeground(application: UIApplication) { 32 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 33 | } 34 | 35 | func applicationDidBecomeActive(application: UIApplication) { 36 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 37 | } 38 | 39 | func applicationWillTerminate(application: UIApplication) { 40 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 41 | } 42 | 43 | 44 | } 45 | 46 | -------------------------------------------------------------------------------- /Data Source/DataSourceBefore/DataSourceBefore/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Created by Tomaz Kragelj on 31.01.2015. 4 | Copyright (c) 2015 Gentle Bytes. 5 | 6 | */ 7 | 8 | import UIKit 9 | 10 | @UIApplicationMain 11 | class AppDelegate: UIResponder, UIApplicationDelegate { 12 | 13 | var window: UIWindow? 14 | 15 | 16 | func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 17 | // Override point for customization after application launch. 18 | return true 19 | } 20 | 21 | func applicationWillResignActive(application: UIApplication) { 22 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 23 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 24 | } 25 | 26 | func applicationDidEnterBackground(application: UIApplication) { 27 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 28 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 29 | } 30 | 31 | func applicationWillEnterForeground(application: UIApplication) { 32 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 33 | } 34 | 35 | func applicationDidBecomeActive(application: UIApplication) { 36 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 37 | } 38 | 39 | func applicationWillTerminate(application: UIApplication) { 40 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 41 | } 42 | 43 | 44 | } 45 | 46 | -------------------------------------------------------------------------------- /MVVM/MVVMAfter/MVVMAfter/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // MVVMBefore 4 | // 5 | // Created by Tomaz Kragelj on 19.02.15. 6 | // Copyright (c) 2015 Gentle Bytes. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | 17 | func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 18 | // Override point for customization after application launch. 19 | return true 20 | } 21 | 22 | func applicationWillResignActive(application: UIApplication) { 23 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 24 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 25 | } 26 | 27 | func applicationDidEnterBackground(application: UIApplication) { 28 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 29 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 30 | } 31 | 32 | func applicationWillEnterForeground(application: UIApplication) { 33 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 34 | } 35 | 36 | func applicationDidBecomeActive(application: UIApplication) { 37 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 38 | } 39 | 40 | func applicationWillTerminate(application: UIApplication) { 41 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 42 | } 43 | 44 | 45 | } 46 | 47 | -------------------------------------------------------------------------------- /MVVM/MVVMBefore/MVVMBefore/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // MVVMBefore 4 | // 5 | // Created by Tomaz Kragelj on 19.02.15. 6 | // Copyright (c) 2015 Gentle Bytes. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | 17 | func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 18 | // Override point for customization after application launch. 19 | return true 20 | } 21 | 22 | func applicationWillResignActive(application: UIApplication) { 23 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 24 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 25 | } 26 | 27 | func applicationDidEnterBackground(application: UIApplication) { 28 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 29 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 30 | } 31 | 32 | func applicationWillEnterForeground(application: UIApplication) { 33 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 34 | } 35 | 36 | func applicationDidBecomeActive(application: UIApplication) { 37 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 38 | } 39 | 40 | func applicationWillTerminate(application: UIApplication) { 41 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 42 | } 43 | 44 | 45 | } 46 | 47 | -------------------------------------------------------------------------------- /MVVM/MVVMBefore/MVVMBefore/ShowViewController.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | private var FolderNameDidChangeContext = 0 4 | private var FolderSizeDidChangeContext = 0 5 | 6 | class ShowViewController: UIViewController { 7 | 8 | deinit { 9 | // Remove observer when deallocating. 10 | self.folder.removeObserver(self, forKeyPath: "name") 11 | self.folder.removeObserver(self, forKeyPath: "size") 12 | } 13 | 14 | // MARK: - Overriden methods 15 | 16 | override func viewDidLoad() { 17 | super.viewDidLoad() 18 | 19 | // Update our views with current data. 20 | self.updateUserInterface() 21 | 22 | // Setup KVO observer for our folder name and size. 23 | self.folder.addObserver(self, forKeyPath: "name", options: nil, context: &FolderNameDidChangeContext) 24 | self.folder.addObserver(self, forKeyPath: "size", options: nil, context: &FolderSizeDidChangeContext) 25 | } 26 | 27 | override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 28 | if segue.identifier == "ChangeFolderNameScene" { 29 | // When change name view controller is instructed, pass it our folder. 30 | let destinationViewController = segue.destinationViewController as! ChangeFolderNameViewController 31 | destinationViewController.folder = self.folder 32 | } 33 | } 34 | 35 | override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer) { 36 | if context == &FolderNameDidChangeContext || context == &FolderSizeDidChangeContext { 37 | println("ShowViewController: folder name or size changed") 38 | self.updateUserInterface() 39 | } else { 40 | super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context) 41 | } 42 | } 43 | 44 | // MARK: - User actions 45 | 46 | @IBAction func toggleFolderSizeChangeSimulation(sender: UISwitch) { 47 | println("ShowViewController: toggling folder size change simulation") 48 | self.folder.simulateSizeChanges = sender.on 49 | } 50 | 51 | // MARK: - Helper methods 52 | 53 | private func updateUserInterface() { 54 | println("ShowViewController: updating user interface") 55 | let sizeInKB = self.folder.size / 1024 56 | self.folderInfoLabel.text = "\(self.folder.name) (\(sizeInKB) KB)" 57 | } 58 | 59 | // MARK: - Properties 60 | 61 | private lazy var folder = DataStore.sharedInstance.folderDataForPath("/Some/Folder/Name") 62 | 63 | @IBOutlet weak var folderInfoLabel: UILabel! 64 | 65 | } 66 | -------------------------------------------------------------------------------- /MVVM/MVVMBefore/MVVMBefore/ChangeFolderNameViewController.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | private var FolderNameDidChangeContext = 0 4 | private var FolderSizeDidChangeContext = 0 5 | 6 | class ChangeFolderNameViewController: UIViewController, UITextFieldDelegate { 7 | 8 | deinit { 9 | // Remove observer when deallocating. 10 | self.folder.removeObserver(self, forKeyPath: "name") 11 | self.folder.removeObserver(self, forKeyPath: "size") 12 | } 13 | 14 | // MARK: - Overriden methods 15 | 16 | override func viewDidLoad() { 17 | super.viewDidLoad() 18 | 19 | // Assign name to text field. 20 | self.nameTextField.text = self.folder.name 21 | 22 | // Update info label. 23 | self.updateUserInterface() 24 | 25 | // Setup KVO for name and size changes on assigned folder. 26 | self.folder.addObserver(self, forKeyPath: "name", options: nil, context: &FolderNameDidChangeContext) 27 | self.folder.addObserver(self, forKeyPath: "size", options: nil, context: &FolderSizeDidChangeContext) 28 | } 29 | 30 | override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer) { 31 | if context == &FolderNameDidChangeContext || context == &FolderSizeDidChangeContext { 32 | // When name or size changes, update info label at the bottom. 33 | println("--> ChangeFolderNameViewController: folder name or size changed") 34 | self.updateUserInterface() 35 | } else { 36 | super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context) 37 | } 38 | } 39 | 40 | // MARK: - Helper methods 41 | 42 | private func updateUserInterface() { 43 | println("ChangeFolderNameViewController: updating user interface") 44 | let sizeInKB = self.folder.size / 1024 45 | self.infoLabel.text = "\(self.folder.name) (\(sizeInKB) KB)" 46 | } 47 | 48 | // MARK: - UITextFieldDelegate implementation 49 | 50 | func textFieldDidEndEditing(textField: UITextField) { 51 | // Store new name to FolderData when text field ends editing. 52 | println("ChangeFolderNameViewController: changing name to \(self.nameTextField.text)") 53 | self.folder.name = self.nameTextField.text 54 | } 55 | 56 | func textFieldShouldReturn(textField: UITextField) -> Bool { 57 | // Hide keyboard when done button is pressed. 58 | textField.resignFirstResponder() 59 | return false 60 | } 61 | 62 | // MARK: - Properties 63 | 64 | var folder: FolderData! 65 | 66 | @IBOutlet weak var nameTextField: UITextField! 67 | @IBOutlet weak var infoLabel: UILabel! 68 | 69 | } 70 | -------------------------------------------------------------------------------- /MVVM/MVVMAfter/MVVMAfter/FolderViewModel.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | private var FolderNameDidChangeContext = 0 4 | private var FolderSizeDidChangeContext = 0 5 | 6 | /** Wrapper view model for FolderData. 7 | 8 | This view model implements the following convenience functions/properties: 9 | 10 | Events: 11 | 12 | - nameDidChange: block that gets called whenever underlying folder name changes 13 | - sizeDidChange: block that gets called whenever underlying folder size changes 14 | - nameOrSizeDidChange: block that gets called when either name or size changes 15 | 16 | Convenience properties: 17 | 18 | - sizeInKB: calculates folder size in KB 19 | - nameAndSizeDescription: this is commonly used in our controllers, so now they can conveniently just use this property 20 | 21 | We could get more creative. For example, we're blindly setting up KVO, but we could do it dynamically, depending on observation blocks client actually subscribe to. 22 | */ 23 | class FolderViewModel: NSObject { 24 | 25 | init(folder: FolderData) { 26 | // Assign folder we're handling. 27 | self.folder = folder 28 | 29 | // Let super class initiale 30 | super.init() 31 | 32 | // Setup KVO. 33 | self.folder.addObserver(self, forKeyPath: "name", options: nil, context: &FolderNameDidChangeContext) 34 | self.folder.addObserver(self, forKeyPath: "size", options: nil, context: &FolderSizeDidChangeContext) 35 | } 36 | 37 | deinit { 38 | // Remove observer when deallocating. 39 | self.folder.removeObserver(self, forKeyPath: "name") 40 | self.folder.removeObserver(self, forKeyPath: "size") 41 | } 42 | 43 | // MARK: - Overriden methods 44 | 45 | override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer) { 46 | if context == &FolderNameDidChangeContext { 47 | println("FolderViewModel: folder name changed, notifying observer") 48 | self.nameDidChange?(name: self.folder.name) 49 | self.nameOrSizeDidChange?() 50 | } else if context == &FolderSizeDidChangeContext { 51 | println("FolderViewModel: folder size changed, notifying observer") 52 | self.sizeDidChange?(size: self.folder.size) 53 | self.nameOrSizeDidChange?() 54 | } else { 55 | super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context) 56 | } 57 | } 58 | 59 | // MARK: - Derived properties 60 | 61 | var sizeInKB: Int { 62 | return self.folder.size / 1024 63 | } 64 | 65 | var nameAndSizeDescription: String { 66 | return "\(self.folder.name) (\(self.sizeInKB) KB)" 67 | } 68 | 69 | // MARK: - Properties 70 | 71 | private (set) internal var folder: FolderData 72 | 73 | var nameDidChange: ((name: String) -> ())? 74 | var sizeDidChange: ((size: Int) -> ())? 75 | var nameOrSizeDidChange: dispatch_block_t? 76 | } 77 | -------------------------------------------------------------------------------- /Data Source/DataSourceBefore/DataSourceBefore/ViewController.swift: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Created by Tomaz Kragelj on 31.01.2015. 4 | Copyright (c) 2015 Gentle Bytes. 5 | 6 | */ 7 | 8 | import UIKit 9 | 10 | class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout { 11 | 12 | override func viewDidLoad() { 13 | super.viewDidLoad() 14 | } 15 | 16 | // MARK: - UICollectionViewDataSource implementation 17 | 18 | func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { 19 | return self.sections.count 20 | } 21 | 22 | func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 23 | let sectionData = self.sections[section] 24 | return sectionData.items.count 25 | } 26 | 27 | func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView { 28 | let sectionData = self.sections[indexPath.section] 29 | 30 | let result = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "SectionCell", forIndexPath: indexPath) as SectionHeaderViewCell 31 | result.configureWithSection(sectionData) 32 | return result; 33 | } 34 | 35 | func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 36 | let sectionData = self.sections[indexPath.section] 37 | let itemData = sectionData.items[indexPath.item] 38 | 39 | let result = collectionView.dequeueReusableCellWithReuseIdentifier("ItemCell", forIndexPath: indexPath) as ItemViewCell 40 | result.configureWithItem(itemData, section: sectionData) 41 | return result 42 | } 43 | 44 | // MARK: - UICollectionViewDelegate implementation 45 | 46 | func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { 47 | let sectionData = self.sections[indexPath.section] 48 | let itemData = sectionData.items[indexPath.item] 49 | 50 | let title = NSLocalizedString("Wonderful!", comment: "") 51 | let message = NSLocalizedString("You just selected \(itemData.title) of \(sectionData.title)! That's a great choice!", comment: "") 52 | let button = NSLocalizedString("I know", comment: "") 53 | 54 | let controller = UIAlertController(title: title, message: message, preferredStyle: .Alert) 55 | controller.addAction(UIAlertAction(title: button, style: .Default, handler: nil)) 56 | 57 | self.presentViewController(controller, animated: true, completion: nil) 58 | } 59 | 60 | // MARK: - UICollectionViewDelegateFlowLayout implementatio 61 | 62 | func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { 63 | let layout = collectionViewLayout as UICollectionViewFlowLayout 64 | return CGSizeMake(CGRectGetWidth(collectionView.frame), layout.itemSize.height) 65 | } 66 | 67 | // MARK: - Properties 68 | 69 | private lazy var sections = testSections() 70 | 71 | @IBOutlet var collectionView: UICollectionView! 72 | 73 | } 74 | 75 | -------------------------------------------------------------------------------- /MVVM/MVVMAfter/MVVMAfter/Base.lproj/LaunchScreen.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 20 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /MVVM/MVVMBefore/MVVMBefore/Base.lproj/LaunchScreen.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 20 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /Data Source/DataSourceAfter/DataSourceAfter/Base.lproj/LaunchScreen.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 20 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /Data Source/DataSourceBefore/DataSourceBefore/Base.lproj/LaunchScreen.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 20 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /Data Source/DataSourceAfter/DataSourceAfter/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 66 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | -------------------------------------------------------------------------------- /Data Source/DataSourceBefore/DataSourceBefore/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 66 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | -------------------------------------------------------------------------------- /MVVM/MVVMAfter/MVVMAfter/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 44 | 54 | 61 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 136 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | -------------------------------------------------------------------------------- /MVVM/MVVMBefore/MVVMBefore/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 44 | 54 | 61 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 136 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | -------------------------------------------------------------------------------- /Data Source/DataSourceBefore/DataSourceBefore.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 73855B631A7D771400E503FA /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73855B621A7D771400E503FA /* AppDelegate.swift */; }; 11 | 73855B651A7D771400E503FA /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73855B641A7D771400E503FA /* ViewController.swift */; }; 12 | 73855B681A7D771400E503FA /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 73855B661A7D771400E503FA /* Main.storyboard */; }; 13 | 73855B6A1A7D771400E503FA /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 73855B691A7D771400E503FA /* Images.xcassets */; }; 14 | 73855B6D1A7D771400E503FA /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 73855B6B1A7D771400E503FA /* LaunchScreen.xib */; }; 15 | 73855B791A7D771400E503FA /* DataSourceBeforeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73855B781A7D771400E503FA /* DataSourceBeforeTests.swift */; }; 16 | 73855B831A7D77DB00E503FA /* Model.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73855B821A7D77DB00E503FA /* Model.swift */; }; 17 | 73855B851A7D7AA200E503FA /* SectionHeaderViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73855B841A7D7AA200E503FA /* SectionHeaderViewCell.swift */; }; 18 | 73855B871A7D7C0900E503FA /* ItemViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73855B861A7D7C0900E503FA /* ItemViewCell.swift */; }; 19 | /* End PBXBuildFile section */ 20 | 21 | /* Begin PBXContainerItemProxy section */ 22 | 73855B731A7D771400E503FA /* PBXContainerItemProxy */ = { 23 | isa = PBXContainerItemProxy; 24 | containerPortal = 73855B551A7D771400E503FA /* Project object */; 25 | proxyType = 1; 26 | remoteGlobalIDString = 73855B5C1A7D771400E503FA; 27 | remoteInfo = DataSourceBefore; 28 | }; 29 | /* End PBXContainerItemProxy section */ 30 | 31 | /* Begin PBXFileReference section */ 32 | 73855B5D1A7D771400E503FA /* DataSourceBefore.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DataSourceBefore.app; sourceTree = BUILT_PRODUCTS_DIR; }; 33 | 73855B611A7D771400E503FA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 34 | 73855B621A7D771400E503FA /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 35 | 73855B641A7D771400E503FA /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 36 | 73855B671A7D771400E503FA /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 37 | 73855B691A7D771400E503FA /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 38 | 73855B6C1A7D771400E503FA /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 39 | 73855B721A7D771400E503FA /* DataSourceBeforeTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DataSourceBeforeTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 40 | 73855B771A7D771400E503FA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 41 | 73855B781A7D771400E503FA /* DataSourceBeforeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataSourceBeforeTests.swift; sourceTree = ""; }; 42 | 73855B821A7D77DB00E503FA /* Model.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Model.swift; sourceTree = ""; }; 43 | 73855B841A7D7AA200E503FA /* SectionHeaderViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SectionHeaderViewCell.swift; sourceTree = ""; }; 44 | 73855B861A7D7C0900E503FA /* ItemViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemViewCell.swift; sourceTree = ""; }; 45 | /* End PBXFileReference section */ 46 | 47 | /* Begin PBXFrameworksBuildPhase section */ 48 | 73855B5A1A7D771400E503FA /* Frameworks */ = { 49 | isa = PBXFrameworksBuildPhase; 50 | buildActionMask = 2147483647; 51 | files = ( 52 | ); 53 | runOnlyForDeploymentPostprocessing = 0; 54 | }; 55 | 73855B6F1A7D771400E503FA /* Frameworks */ = { 56 | isa = PBXFrameworksBuildPhase; 57 | buildActionMask = 2147483647; 58 | files = ( 59 | ); 60 | runOnlyForDeploymentPostprocessing = 0; 61 | }; 62 | /* End PBXFrameworksBuildPhase section */ 63 | 64 | /* Begin PBXGroup section */ 65 | 73855B541A7D771400E503FA = { 66 | isa = PBXGroup; 67 | children = ( 68 | 73855B5F1A7D771400E503FA /* DataSourceBefore */, 69 | 73855B751A7D771400E503FA /* DataSourceBeforeTests */, 70 | 73855B5E1A7D771400E503FA /* Products */, 71 | ); 72 | sourceTree = ""; 73 | }; 74 | 73855B5E1A7D771400E503FA /* Products */ = { 75 | isa = PBXGroup; 76 | children = ( 77 | 73855B5D1A7D771400E503FA /* DataSourceBefore.app */, 78 | 73855B721A7D771400E503FA /* DataSourceBeforeTests.xctest */, 79 | ); 80 | name = Products; 81 | sourceTree = ""; 82 | }; 83 | 73855B5F1A7D771400E503FA /* DataSourceBefore */ = { 84 | isa = PBXGroup; 85 | children = ( 86 | 73855B881A7D7C1700E503FA /* Cells */, 87 | 73855B821A7D77DB00E503FA /* Model.swift */, 88 | 73855B621A7D771400E503FA /* AppDelegate.swift */, 89 | 73855B641A7D771400E503FA /* ViewController.swift */, 90 | 73855B661A7D771400E503FA /* Main.storyboard */, 91 | 73855B6B1A7D771400E503FA /* LaunchScreen.xib */, 92 | 73855B691A7D771400E503FA /* Images.xcassets */, 93 | 73855B601A7D771400E503FA /* Supporting Files */, 94 | ); 95 | path = DataSourceBefore; 96 | sourceTree = ""; 97 | }; 98 | 73855B601A7D771400E503FA /* Supporting Files */ = { 99 | isa = PBXGroup; 100 | children = ( 101 | 73855B611A7D771400E503FA /* Info.plist */, 102 | ); 103 | name = "Supporting Files"; 104 | sourceTree = ""; 105 | }; 106 | 73855B751A7D771400E503FA /* DataSourceBeforeTests */ = { 107 | isa = PBXGroup; 108 | children = ( 109 | 73855B781A7D771400E503FA /* DataSourceBeforeTests.swift */, 110 | 73855B761A7D771400E503FA /* Supporting Files */, 111 | ); 112 | path = DataSourceBeforeTests; 113 | sourceTree = ""; 114 | }; 115 | 73855B761A7D771400E503FA /* Supporting Files */ = { 116 | isa = PBXGroup; 117 | children = ( 118 | 73855B771A7D771400E503FA /* Info.plist */, 119 | ); 120 | name = "Supporting Files"; 121 | sourceTree = ""; 122 | }; 123 | 73855B881A7D7C1700E503FA /* Cells */ = { 124 | isa = PBXGroup; 125 | children = ( 126 | 73855B841A7D7AA200E503FA /* SectionHeaderViewCell.swift */, 127 | 73855B861A7D7C0900E503FA /* ItemViewCell.swift */, 128 | ); 129 | name = Cells; 130 | sourceTree = ""; 131 | }; 132 | /* End PBXGroup section */ 133 | 134 | /* Begin PBXNativeTarget section */ 135 | 73855B5C1A7D771400E503FA /* DataSourceBefore */ = { 136 | isa = PBXNativeTarget; 137 | buildConfigurationList = 73855B7C1A7D771400E503FA /* Build configuration list for PBXNativeTarget "DataSourceBefore" */; 138 | buildPhases = ( 139 | 73855B591A7D771400E503FA /* Sources */, 140 | 73855B5A1A7D771400E503FA /* Frameworks */, 141 | 73855B5B1A7D771400E503FA /* Resources */, 142 | ); 143 | buildRules = ( 144 | ); 145 | dependencies = ( 146 | ); 147 | name = DataSourceBefore; 148 | productName = DataSourceBefore; 149 | productReference = 73855B5D1A7D771400E503FA /* DataSourceBefore.app */; 150 | productType = "com.apple.product-type.application"; 151 | }; 152 | 73855B711A7D771400E503FA /* DataSourceBeforeTests */ = { 153 | isa = PBXNativeTarget; 154 | buildConfigurationList = 73855B7F1A7D771400E503FA /* Build configuration list for PBXNativeTarget "DataSourceBeforeTests" */; 155 | buildPhases = ( 156 | 73855B6E1A7D771400E503FA /* Sources */, 157 | 73855B6F1A7D771400E503FA /* Frameworks */, 158 | 73855B701A7D771400E503FA /* Resources */, 159 | ); 160 | buildRules = ( 161 | ); 162 | dependencies = ( 163 | 73855B741A7D771400E503FA /* PBXTargetDependency */, 164 | ); 165 | name = DataSourceBeforeTests; 166 | productName = DataSourceBeforeTests; 167 | productReference = 73855B721A7D771400E503FA /* DataSourceBeforeTests.xctest */; 168 | productType = "com.apple.product-type.bundle.unit-test"; 169 | }; 170 | /* End PBXNativeTarget section */ 171 | 172 | /* Begin PBXProject section */ 173 | 73855B551A7D771400E503FA /* Project object */ = { 174 | isa = PBXProject; 175 | attributes = { 176 | LastUpgradeCheck = 0610; 177 | ORGANIZATIONNAME = "Gentle Bytes"; 178 | TargetAttributes = { 179 | 73855B5C1A7D771400E503FA = { 180 | CreatedOnToolsVersion = 6.1.1; 181 | }; 182 | 73855B711A7D771400E503FA = { 183 | CreatedOnToolsVersion = 6.1.1; 184 | TestTargetID = 73855B5C1A7D771400E503FA; 185 | }; 186 | }; 187 | }; 188 | buildConfigurationList = 73855B581A7D771400E503FA /* Build configuration list for PBXProject "DataSourceBefore" */; 189 | compatibilityVersion = "Xcode 3.2"; 190 | developmentRegion = English; 191 | hasScannedForEncodings = 0; 192 | knownRegions = ( 193 | en, 194 | Base, 195 | ); 196 | mainGroup = 73855B541A7D771400E503FA; 197 | productRefGroup = 73855B5E1A7D771400E503FA /* Products */; 198 | projectDirPath = ""; 199 | projectRoot = ""; 200 | targets = ( 201 | 73855B5C1A7D771400E503FA /* DataSourceBefore */, 202 | 73855B711A7D771400E503FA /* DataSourceBeforeTests */, 203 | ); 204 | }; 205 | /* End PBXProject section */ 206 | 207 | /* Begin PBXResourcesBuildPhase section */ 208 | 73855B5B1A7D771400E503FA /* Resources */ = { 209 | isa = PBXResourcesBuildPhase; 210 | buildActionMask = 2147483647; 211 | files = ( 212 | 73855B681A7D771400E503FA /* Main.storyboard in Resources */, 213 | 73855B6D1A7D771400E503FA /* LaunchScreen.xib in Resources */, 214 | 73855B6A1A7D771400E503FA /* Images.xcassets in Resources */, 215 | ); 216 | runOnlyForDeploymentPostprocessing = 0; 217 | }; 218 | 73855B701A7D771400E503FA /* Resources */ = { 219 | isa = PBXResourcesBuildPhase; 220 | buildActionMask = 2147483647; 221 | files = ( 222 | ); 223 | runOnlyForDeploymentPostprocessing = 0; 224 | }; 225 | /* End PBXResourcesBuildPhase section */ 226 | 227 | /* Begin PBXSourcesBuildPhase section */ 228 | 73855B591A7D771400E503FA /* Sources */ = { 229 | isa = PBXSourcesBuildPhase; 230 | buildActionMask = 2147483647; 231 | files = ( 232 | 73855B871A7D7C0900E503FA /* ItemViewCell.swift in Sources */, 233 | 73855B651A7D771400E503FA /* ViewController.swift in Sources */, 234 | 73855B631A7D771400E503FA /* AppDelegate.swift in Sources */, 235 | 73855B831A7D77DB00E503FA /* Model.swift in Sources */, 236 | 73855B851A7D7AA200E503FA /* SectionHeaderViewCell.swift in Sources */, 237 | ); 238 | runOnlyForDeploymentPostprocessing = 0; 239 | }; 240 | 73855B6E1A7D771400E503FA /* Sources */ = { 241 | isa = PBXSourcesBuildPhase; 242 | buildActionMask = 2147483647; 243 | files = ( 244 | 73855B791A7D771400E503FA /* DataSourceBeforeTests.swift in Sources */, 245 | ); 246 | runOnlyForDeploymentPostprocessing = 0; 247 | }; 248 | /* End PBXSourcesBuildPhase section */ 249 | 250 | /* Begin PBXTargetDependency section */ 251 | 73855B741A7D771400E503FA /* PBXTargetDependency */ = { 252 | isa = PBXTargetDependency; 253 | target = 73855B5C1A7D771400E503FA /* DataSourceBefore */; 254 | targetProxy = 73855B731A7D771400E503FA /* PBXContainerItemProxy */; 255 | }; 256 | /* End PBXTargetDependency section */ 257 | 258 | /* Begin PBXVariantGroup section */ 259 | 73855B661A7D771400E503FA /* Main.storyboard */ = { 260 | isa = PBXVariantGroup; 261 | children = ( 262 | 73855B671A7D771400E503FA /* Base */, 263 | ); 264 | name = Main.storyboard; 265 | sourceTree = ""; 266 | }; 267 | 73855B6B1A7D771400E503FA /* LaunchScreen.xib */ = { 268 | isa = PBXVariantGroup; 269 | children = ( 270 | 73855B6C1A7D771400E503FA /* Base */, 271 | ); 272 | name = LaunchScreen.xib; 273 | sourceTree = ""; 274 | }; 275 | /* End PBXVariantGroup section */ 276 | 277 | /* Begin XCBuildConfiguration section */ 278 | 73855B7A1A7D771400E503FA /* Debug */ = { 279 | isa = XCBuildConfiguration; 280 | buildSettings = { 281 | ALWAYS_SEARCH_USER_PATHS = NO; 282 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 283 | CLANG_CXX_LIBRARY = "libc++"; 284 | CLANG_ENABLE_MODULES = YES; 285 | CLANG_ENABLE_OBJC_ARC = YES; 286 | CLANG_WARN_BOOL_CONVERSION = YES; 287 | CLANG_WARN_CONSTANT_CONVERSION = YES; 288 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 289 | CLANG_WARN_EMPTY_BODY = YES; 290 | CLANG_WARN_ENUM_CONVERSION = YES; 291 | CLANG_WARN_INT_CONVERSION = YES; 292 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 293 | CLANG_WARN_UNREACHABLE_CODE = YES; 294 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 295 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 296 | COPY_PHASE_STRIP = NO; 297 | ENABLE_STRICT_OBJC_MSGSEND = YES; 298 | GCC_C_LANGUAGE_STANDARD = gnu99; 299 | GCC_DYNAMIC_NO_PIC = NO; 300 | GCC_OPTIMIZATION_LEVEL = 0; 301 | GCC_PREPROCESSOR_DEFINITIONS = ( 302 | "DEBUG=1", 303 | "$(inherited)", 304 | ); 305 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 306 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 307 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 308 | GCC_WARN_UNDECLARED_SELECTOR = YES; 309 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 310 | GCC_WARN_UNUSED_FUNCTION = YES; 311 | GCC_WARN_UNUSED_VARIABLE = YES; 312 | IPHONEOS_DEPLOYMENT_TARGET = 8.1; 313 | MTL_ENABLE_DEBUG_INFO = YES; 314 | ONLY_ACTIVE_ARCH = YES; 315 | SDKROOT = iphoneos; 316 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 317 | TARGETED_DEVICE_FAMILY = "1,2"; 318 | }; 319 | name = Debug; 320 | }; 321 | 73855B7B1A7D771400E503FA /* Release */ = { 322 | isa = XCBuildConfiguration; 323 | buildSettings = { 324 | ALWAYS_SEARCH_USER_PATHS = NO; 325 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 326 | CLANG_CXX_LIBRARY = "libc++"; 327 | CLANG_ENABLE_MODULES = YES; 328 | CLANG_ENABLE_OBJC_ARC = YES; 329 | CLANG_WARN_BOOL_CONVERSION = YES; 330 | CLANG_WARN_CONSTANT_CONVERSION = YES; 331 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 332 | CLANG_WARN_EMPTY_BODY = YES; 333 | CLANG_WARN_ENUM_CONVERSION = YES; 334 | CLANG_WARN_INT_CONVERSION = YES; 335 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 336 | CLANG_WARN_UNREACHABLE_CODE = YES; 337 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 338 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 339 | COPY_PHASE_STRIP = YES; 340 | ENABLE_NS_ASSERTIONS = NO; 341 | ENABLE_STRICT_OBJC_MSGSEND = YES; 342 | GCC_C_LANGUAGE_STANDARD = gnu99; 343 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 344 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 345 | GCC_WARN_UNDECLARED_SELECTOR = YES; 346 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 347 | GCC_WARN_UNUSED_FUNCTION = YES; 348 | GCC_WARN_UNUSED_VARIABLE = YES; 349 | IPHONEOS_DEPLOYMENT_TARGET = 8.1; 350 | MTL_ENABLE_DEBUG_INFO = NO; 351 | SDKROOT = iphoneos; 352 | TARGETED_DEVICE_FAMILY = "1,2"; 353 | VALIDATE_PRODUCT = YES; 354 | }; 355 | name = Release; 356 | }; 357 | 73855B7D1A7D771400E503FA /* Debug */ = { 358 | isa = XCBuildConfiguration; 359 | buildSettings = { 360 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 361 | INFOPLIST_FILE = DataSourceBefore/Info.plist; 362 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 363 | PRODUCT_NAME = "$(TARGET_NAME)"; 364 | }; 365 | name = Debug; 366 | }; 367 | 73855B7E1A7D771400E503FA /* Release */ = { 368 | isa = XCBuildConfiguration; 369 | buildSettings = { 370 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 371 | INFOPLIST_FILE = DataSourceBefore/Info.plist; 372 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 373 | PRODUCT_NAME = "$(TARGET_NAME)"; 374 | }; 375 | name = Release; 376 | }; 377 | 73855B801A7D771400E503FA /* Debug */ = { 378 | isa = XCBuildConfiguration; 379 | buildSettings = { 380 | BUNDLE_LOADER = "$(TEST_HOST)"; 381 | FRAMEWORK_SEARCH_PATHS = ( 382 | "$(SDKROOT)/Developer/Library/Frameworks", 383 | "$(inherited)", 384 | ); 385 | GCC_PREPROCESSOR_DEFINITIONS = ( 386 | "DEBUG=1", 387 | "$(inherited)", 388 | ); 389 | INFOPLIST_FILE = DataSourceBeforeTests/Info.plist; 390 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 391 | PRODUCT_NAME = "$(TARGET_NAME)"; 392 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/DataSourceBefore.app/DataSourceBefore"; 393 | }; 394 | name = Debug; 395 | }; 396 | 73855B811A7D771400E503FA /* Release */ = { 397 | isa = XCBuildConfiguration; 398 | buildSettings = { 399 | BUNDLE_LOADER = "$(TEST_HOST)"; 400 | FRAMEWORK_SEARCH_PATHS = ( 401 | "$(SDKROOT)/Developer/Library/Frameworks", 402 | "$(inherited)", 403 | ); 404 | INFOPLIST_FILE = DataSourceBeforeTests/Info.plist; 405 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 406 | PRODUCT_NAME = "$(TARGET_NAME)"; 407 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/DataSourceBefore.app/DataSourceBefore"; 408 | }; 409 | name = Release; 410 | }; 411 | /* End XCBuildConfiguration section */ 412 | 413 | /* Begin XCConfigurationList section */ 414 | 73855B581A7D771400E503FA /* Build configuration list for PBXProject "DataSourceBefore" */ = { 415 | isa = XCConfigurationList; 416 | buildConfigurations = ( 417 | 73855B7A1A7D771400E503FA /* Debug */, 418 | 73855B7B1A7D771400E503FA /* Release */, 419 | ); 420 | defaultConfigurationIsVisible = 0; 421 | defaultConfigurationName = Release; 422 | }; 423 | 73855B7C1A7D771400E503FA /* Build configuration list for PBXNativeTarget "DataSourceBefore" */ = { 424 | isa = XCConfigurationList; 425 | buildConfigurations = ( 426 | 73855B7D1A7D771400E503FA /* Debug */, 427 | 73855B7E1A7D771400E503FA /* Release */, 428 | ); 429 | defaultConfigurationIsVisible = 0; 430 | }; 431 | 73855B7F1A7D771400E503FA /* Build configuration list for PBXNativeTarget "DataSourceBeforeTests" */ = { 432 | isa = XCConfigurationList; 433 | buildConfigurations = ( 434 | 73855B801A7D771400E503FA /* Debug */, 435 | 73855B811A7D771400E503FA /* Release */, 436 | ); 437 | defaultConfigurationIsVisible = 0; 438 | }; 439 | /* End XCConfigurationList section */ 440 | }; 441 | rootObject = 73855B551A7D771400E503FA /* Project object */; 442 | } 443 | -------------------------------------------------------------------------------- /Data Source/DataSourceAfter/DataSourceAfter.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 73855B981A7D807D00E503FA /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73855B971A7D807D00E503FA /* AppDelegate.swift */; }; 11 | 73855B9A1A7D807D00E503FA /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73855B991A7D807D00E503FA /* ViewController.swift */; }; 12 | 73855B9D1A7D807D00E503FA /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 73855B9B1A7D807D00E503FA /* Main.storyboard */; }; 13 | 73855B9F1A7D807D00E503FA /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 73855B9E1A7D807D00E503FA /* Images.xcassets */; }; 14 | 73855BA21A7D807D00E503FA /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 73855BA01A7D807D00E503FA /* LaunchScreen.xib */; }; 15 | 73855BAE1A7D807D00E503FA /* DataSourceAfterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73855BAD1A7D807D00E503FA /* DataSourceAfterTests.swift */; }; 16 | 73855BBA1A7D80F900E503FA /* ItemViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73855BB81A7D80F900E503FA /* ItemViewCell.swift */; }; 17 | 73855BBB1A7D80F900E503FA /* SectionHeaderViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73855BB91A7D80F900E503FA /* SectionHeaderViewCell.swift */; }; 18 | 73855BBD1A7D810800E503FA /* Model.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73855BBC1A7D810800E503FA /* Model.swift */; }; 19 | 73855BBF1A7D815900E503FA /* ItemsDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73855BBE1A7D815900E503FA /* ItemsDataSource.swift */; }; 20 | /* End PBXBuildFile section */ 21 | 22 | /* Begin PBXContainerItemProxy section */ 23 | 73855BA81A7D807D00E503FA /* PBXContainerItemProxy */ = { 24 | isa = PBXContainerItemProxy; 25 | containerPortal = 73855B8A1A7D807D00E503FA /* Project object */; 26 | proxyType = 1; 27 | remoteGlobalIDString = 73855B911A7D807D00E503FA; 28 | remoteInfo = DataSourceAfter; 29 | }; 30 | /* End PBXContainerItemProxy section */ 31 | 32 | /* Begin PBXFileReference section */ 33 | 73855B921A7D807D00E503FA /* DataSourceAfter.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DataSourceAfter.app; sourceTree = BUILT_PRODUCTS_DIR; }; 34 | 73855B961A7D807D00E503FA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 35 | 73855B971A7D807D00E503FA /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 36 | 73855B991A7D807D00E503FA /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 37 | 73855B9C1A7D807D00E503FA /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 38 | 73855B9E1A7D807D00E503FA /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 39 | 73855BA11A7D807D00E503FA /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 40 | 73855BA71A7D807D00E503FA /* DataSourceAfterTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DataSourceAfterTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 41 | 73855BAC1A7D807D00E503FA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 42 | 73855BAD1A7D807D00E503FA /* DataSourceAfterTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataSourceAfterTests.swift; sourceTree = ""; }; 43 | 73855BB81A7D80F900E503FA /* ItemViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemViewCell.swift; sourceTree = ""; }; 44 | 73855BB91A7D80F900E503FA /* SectionHeaderViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SectionHeaderViewCell.swift; sourceTree = ""; }; 45 | 73855BBC1A7D810800E503FA /* Model.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Model.swift; sourceTree = ""; }; 46 | 73855BBE1A7D815900E503FA /* ItemsDataSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemsDataSource.swift; sourceTree = ""; }; 47 | /* End PBXFileReference section */ 48 | 49 | /* Begin PBXFrameworksBuildPhase section */ 50 | 73855B8F1A7D807D00E503FA /* Frameworks */ = { 51 | isa = PBXFrameworksBuildPhase; 52 | buildActionMask = 2147483647; 53 | files = ( 54 | ); 55 | runOnlyForDeploymentPostprocessing = 0; 56 | }; 57 | 73855BA41A7D807D00E503FA /* Frameworks */ = { 58 | isa = PBXFrameworksBuildPhase; 59 | buildActionMask = 2147483647; 60 | files = ( 61 | ); 62 | runOnlyForDeploymentPostprocessing = 0; 63 | }; 64 | /* End PBXFrameworksBuildPhase section */ 65 | 66 | /* Begin PBXGroup section */ 67 | 73855B891A7D807D00E503FA = { 68 | isa = PBXGroup; 69 | children = ( 70 | 73855BBE1A7D815900E503FA /* ItemsDataSource.swift */, 71 | 73855B941A7D807D00E503FA /* DataSourceAfter */, 72 | 73855BAA1A7D807D00E503FA /* DataSourceAfterTests */, 73 | 73855B931A7D807D00E503FA /* Products */, 74 | ); 75 | sourceTree = ""; 76 | }; 77 | 73855B931A7D807D00E503FA /* Products */ = { 78 | isa = PBXGroup; 79 | children = ( 80 | 73855B921A7D807D00E503FA /* DataSourceAfter.app */, 81 | 73855BA71A7D807D00E503FA /* DataSourceAfterTests.xctest */, 82 | ); 83 | name = Products; 84 | sourceTree = ""; 85 | }; 86 | 73855B941A7D807D00E503FA /* DataSourceAfter */ = { 87 | isa = PBXGroup; 88 | children = ( 89 | 73855BB71A7D808800E503FA /* Cells */, 90 | 73855BBC1A7D810800E503FA /* Model.swift */, 91 | 73855B971A7D807D00E503FA /* AppDelegate.swift */, 92 | 73855B991A7D807D00E503FA /* ViewController.swift */, 93 | 73855B9B1A7D807D00E503FA /* Main.storyboard */, 94 | 73855BA01A7D807D00E503FA /* LaunchScreen.xib */, 95 | 73855B9E1A7D807D00E503FA /* Images.xcassets */, 96 | 73855B951A7D807D00E503FA /* Supporting Files */, 97 | ); 98 | path = DataSourceAfter; 99 | sourceTree = ""; 100 | }; 101 | 73855B951A7D807D00E503FA /* Supporting Files */ = { 102 | isa = PBXGroup; 103 | children = ( 104 | 73855B961A7D807D00E503FA /* Info.plist */, 105 | ); 106 | name = "Supporting Files"; 107 | sourceTree = ""; 108 | }; 109 | 73855BAA1A7D807D00E503FA /* DataSourceAfterTests */ = { 110 | isa = PBXGroup; 111 | children = ( 112 | 73855BAD1A7D807D00E503FA /* DataSourceAfterTests.swift */, 113 | 73855BAB1A7D807D00E503FA /* Supporting Files */, 114 | ); 115 | path = DataSourceAfterTests; 116 | sourceTree = ""; 117 | }; 118 | 73855BAB1A7D807D00E503FA /* Supporting Files */ = { 119 | isa = PBXGroup; 120 | children = ( 121 | 73855BAC1A7D807D00E503FA /* Info.plist */, 122 | ); 123 | name = "Supporting Files"; 124 | sourceTree = ""; 125 | }; 126 | 73855BB71A7D808800E503FA /* Cells */ = { 127 | isa = PBXGroup; 128 | children = ( 129 | 73855BB91A7D80F900E503FA /* SectionHeaderViewCell.swift */, 130 | 73855BB81A7D80F900E503FA /* ItemViewCell.swift */, 131 | ); 132 | name = Cells; 133 | sourceTree = ""; 134 | }; 135 | /* End PBXGroup section */ 136 | 137 | /* Begin PBXNativeTarget section */ 138 | 73855B911A7D807D00E503FA /* DataSourceAfter */ = { 139 | isa = PBXNativeTarget; 140 | buildConfigurationList = 73855BB11A7D807D00E503FA /* Build configuration list for PBXNativeTarget "DataSourceAfter" */; 141 | buildPhases = ( 142 | 73855B8E1A7D807D00E503FA /* Sources */, 143 | 73855B8F1A7D807D00E503FA /* Frameworks */, 144 | 73855B901A7D807D00E503FA /* Resources */, 145 | ); 146 | buildRules = ( 147 | ); 148 | dependencies = ( 149 | ); 150 | name = DataSourceAfter; 151 | productName = DataSourceAfter; 152 | productReference = 73855B921A7D807D00E503FA /* DataSourceAfter.app */; 153 | productType = "com.apple.product-type.application"; 154 | }; 155 | 73855BA61A7D807D00E503FA /* DataSourceAfterTests */ = { 156 | isa = PBXNativeTarget; 157 | buildConfigurationList = 73855BB41A7D807D00E503FA /* Build configuration list for PBXNativeTarget "DataSourceAfterTests" */; 158 | buildPhases = ( 159 | 73855BA31A7D807D00E503FA /* Sources */, 160 | 73855BA41A7D807D00E503FA /* Frameworks */, 161 | 73855BA51A7D807D00E503FA /* Resources */, 162 | ); 163 | buildRules = ( 164 | ); 165 | dependencies = ( 166 | 73855BA91A7D807D00E503FA /* PBXTargetDependency */, 167 | ); 168 | name = DataSourceAfterTests; 169 | productName = DataSourceAfterTests; 170 | productReference = 73855BA71A7D807D00E503FA /* DataSourceAfterTests.xctest */; 171 | productType = "com.apple.product-type.bundle.unit-test"; 172 | }; 173 | /* End PBXNativeTarget section */ 174 | 175 | /* Begin PBXProject section */ 176 | 73855B8A1A7D807D00E503FA /* Project object */ = { 177 | isa = PBXProject; 178 | attributes = { 179 | LastUpgradeCheck = 0610; 180 | ORGANIZATIONNAME = "Gentle Bytes"; 181 | TargetAttributes = { 182 | 73855B911A7D807D00E503FA = { 183 | CreatedOnToolsVersion = 6.1.1; 184 | }; 185 | 73855BA61A7D807D00E503FA = { 186 | CreatedOnToolsVersion = 6.1.1; 187 | TestTargetID = 73855B911A7D807D00E503FA; 188 | }; 189 | }; 190 | }; 191 | buildConfigurationList = 73855B8D1A7D807D00E503FA /* Build configuration list for PBXProject "DataSourceAfter" */; 192 | compatibilityVersion = "Xcode 3.2"; 193 | developmentRegion = English; 194 | hasScannedForEncodings = 0; 195 | knownRegions = ( 196 | en, 197 | Base, 198 | ); 199 | mainGroup = 73855B891A7D807D00E503FA; 200 | productRefGroup = 73855B931A7D807D00E503FA /* Products */; 201 | projectDirPath = ""; 202 | projectRoot = ""; 203 | targets = ( 204 | 73855B911A7D807D00E503FA /* DataSourceAfter */, 205 | 73855BA61A7D807D00E503FA /* DataSourceAfterTests */, 206 | ); 207 | }; 208 | /* End PBXProject section */ 209 | 210 | /* Begin PBXResourcesBuildPhase section */ 211 | 73855B901A7D807D00E503FA /* Resources */ = { 212 | isa = PBXResourcesBuildPhase; 213 | buildActionMask = 2147483647; 214 | files = ( 215 | 73855B9D1A7D807D00E503FA /* Main.storyboard in Resources */, 216 | 73855BA21A7D807D00E503FA /* LaunchScreen.xib in Resources */, 217 | 73855B9F1A7D807D00E503FA /* Images.xcassets in Resources */, 218 | ); 219 | runOnlyForDeploymentPostprocessing = 0; 220 | }; 221 | 73855BA51A7D807D00E503FA /* Resources */ = { 222 | isa = PBXResourcesBuildPhase; 223 | buildActionMask = 2147483647; 224 | files = ( 225 | ); 226 | runOnlyForDeploymentPostprocessing = 0; 227 | }; 228 | /* End PBXResourcesBuildPhase section */ 229 | 230 | /* Begin PBXSourcesBuildPhase section */ 231 | 73855B8E1A7D807D00E503FA /* Sources */ = { 232 | isa = PBXSourcesBuildPhase; 233 | buildActionMask = 2147483647; 234 | files = ( 235 | 73855BBD1A7D810800E503FA /* Model.swift in Sources */, 236 | 73855BBA1A7D80F900E503FA /* ItemViewCell.swift in Sources */, 237 | 73855B9A1A7D807D00E503FA /* ViewController.swift in Sources */, 238 | 73855BBF1A7D815900E503FA /* ItemsDataSource.swift in Sources */, 239 | 73855B981A7D807D00E503FA /* AppDelegate.swift in Sources */, 240 | 73855BBB1A7D80F900E503FA /* SectionHeaderViewCell.swift in Sources */, 241 | ); 242 | runOnlyForDeploymentPostprocessing = 0; 243 | }; 244 | 73855BA31A7D807D00E503FA /* Sources */ = { 245 | isa = PBXSourcesBuildPhase; 246 | buildActionMask = 2147483647; 247 | files = ( 248 | 73855BAE1A7D807D00E503FA /* DataSourceAfterTests.swift in Sources */, 249 | ); 250 | runOnlyForDeploymentPostprocessing = 0; 251 | }; 252 | /* End PBXSourcesBuildPhase section */ 253 | 254 | /* Begin PBXTargetDependency section */ 255 | 73855BA91A7D807D00E503FA /* PBXTargetDependency */ = { 256 | isa = PBXTargetDependency; 257 | target = 73855B911A7D807D00E503FA /* DataSourceAfter */; 258 | targetProxy = 73855BA81A7D807D00E503FA /* PBXContainerItemProxy */; 259 | }; 260 | /* End PBXTargetDependency section */ 261 | 262 | /* Begin PBXVariantGroup section */ 263 | 73855B9B1A7D807D00E503FA /* Main.storyboard */ = { 264 | isa = PBXVariantGroup; 265 | children = ( 266 | 73855B9C1A7D807D00E503FA /* Base */, 267 | ); 268 | name = Main.storyboard; 269 | sourceTree = ""; 270 | }; 271 | 73855BA01A7D807D00E503FA /* LaunchScreen.xib */ = { 272 | isa = PBXVariantGroup; 273 | children = ( 274 | 73855BA11A7D807D00E503FA /* Base */, 275 | ); 276 | name = LaunchScreen.xib; 277 | sourceTree = ""; 278 | }; 279 | /* End PBXVariantGroup section */ 280 | 281 | /* Begin XCBuildConfiguration section */ 282 | 73855BAF1A7D807D00E503FA /* Debug */ = { 283 | isa = XCBuildConfiguration; 284 | buildSettings = { 285 | ALWAYS_SEARCH_USER_PATHS = NO; 286 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 287 | CLANG_CXX_LIBRARY = "libc++"; 288 | CLANG_ENABLE_MODULES = YES; 289 | CLANG_ENABLE_OBJC_ARC = YES; 290 | CLANG_WARN_BOOL_CONVERSION = YES; 291 | CLANG_WARN_CONSTANT_CONVERSION = YES; 292 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 293 | CLANG_WARN_EMPTY_BODY = YES; 294 | CLANG_WARN_ENUM_CONVERSION = YES; 295 | CLANG_WARN_INT_CONVERSION = YES; 296 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 297 | CLANG_WARN_UNREACHABLE_CODE = YES; 298 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 299 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 300 | COPY_PHASE_STRIP = NO; 301 | ENABLE_STRICT_OBJC_MSGSEND = YES; 302 | GCC_C_LANGUAGE_STANDARD = gnu99; 303 | GCC_DYNAMIC_NO_PIC = NO; 304 | GCC_OPTIMIZATION_LEVEL = 0; 305 | GCC_PREPROCESSOR_DEFINITIONS = ( 306 | "DEBUG=1", 307 | "$(inherited)", 308 | ); 309 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 310 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 311 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 312 | GCC_WARN_UNDECLARED_SELECTOR = YES; 313 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 314 | GCC_WARN_UNUSED_FUNCTION = YES; 315 | GCC_WARN_UNUSED_VARIABLE = YES; 316 | IPHONEOS_DEPLOYMENT_TARGET = 8.1; 317 | MTL_ENABLE_DEBUG_INFO = YES; 318 | ONLY_ACTIVE_ARCH = YES; 319 | SDKROOT = iphoneos; 320 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 321 | TARGETED_DEVICE_FAMILY = "1,2"; 322 | }; 323 | name = Debug; 324 | }; 325 | 73855BB01A7D807D00E503FA /* Release */ = { 326 | isa = XCBuildConfiguration; 327 | buildSettings = { 328 | ALWAYS_SEARCH_USER_PATHS = NO; 329 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 330 | CLANG_CXX_LIBRARY = "libc++"; 331 | CLANG_ENABLE_MODULES = YES; 332 | CLANG_ENABLE_OBJC_ARC = YES; 333 | CLANG_WARN_BOOL_CONVERSION = YES; 334 | CLANG_WARN_CONSTANT_CONVERSION = YES; 335 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 336 | CLANG_WARN_EMPTY_BODY = YES; 337 | CLANG_WARN_ENUM_CONVERSION = YES; 338 | CLANG_WARN_INT_CONVERSION = YES; 339 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 340 | CLANG_WARN_UNREACHABLE_CODE = YES; 341 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 342 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 343 | COPY_PHASE_STRIP = YES; 344 | ENABLE_NS_ASSERTIONS = NO; 345 | ENABLE_STRICT_OBJC_MSGSEND = YES; 346 | GCC_C_LANGUAGE_STANDARD = gnu99; 347 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 348 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 349 | GCC_WARN_UNDECLARED_SELECTOR = YES; 350 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 351 | GCC_WARN_UNUSED_FUNCTION = YES; 352 | GCC_WARN_UNUSED_VARIABLE = YES; 353 | IPHONEOS_DEPLOYMENT_TARGET = 8.1; 354 | MTL_ENABLE_DEBUG_INFO = NO; 355 | SDKROOT = iphoneos; 356 | TARGETED_DEVICE_FAMILY = "1,2"; 357 | VALIDATE_PRODUCT = YES; 358 | }; 359 | name = Release; 360 | }; 361 | 73855BB21A7D807D00E503FA /* Debug */ = { 362 | isa = XCBuildConfiguration; 363 | buildSettings = { 364 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 365 | INFOPLIST_FILE = DataSourceAfter/Info.plist; 366 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 367 | PRODUCT_NAME = "$(TARGET_NAME)"; 368 | }; 369 | name = Debug; 370 | }; 371 | 73855BB31A7D807D00E503FA /* Release */ = { 372 | isa = XCBuildConfiguration; 373 | buildSettings = { 374 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 375 | INFOPLIST_FILE = DataSourceAfter/Info.plist; 376 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 377 | PRODUCT_NAME = "$(TARGET_NAME)"; 378 | }; 379 | name = Release; 380 | }; 381 | 73855BB51A7D807D00E503FA /* Debug */ = { 382 | isa = XCBuildConfiguration; 383 | buildSettings = { 384 | BUNDLE_LOADER = "$(TEST_HOST)"; 385 | FRAMEWORK_SEARCH_PATHS = ( 386 | "$(SDKROOT)/Developer/Library/Frameworks", 387 | "$(inherited)", 388 | ); 389 | GCC_PREPROCESSOR_DEFINITIONS = ( 390 | "DEBUG=1", 391 | "$(inherited)", 392 | ); 393 | INFOPLIST_FILE = DataSourceAfterTests/Info.plist; 394 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 395 | PRODUCT_NAME = "$(TARGET_NAME)"; 396 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/DataSourceAfter.app/DataSourceAfter"; 397 | }; 398 | name = Debug; 399 | }; 400 | 73855BB61A7D807D00E503FA /* Release */ = { 401 | isa = XCBuildConfiguration; 402 | buildSettings = { 403 | BUNDLE_LOADER = "$(TEST_HOST)"; 404 | FRAMEWORK_SEARCH_PATHS = ( 405 | "$(SDKROOT)/Developer/Library/Frameworks", 406 | "$(inherited)", 407 | ); 408 | INFOPLIST_FILE = DataSourceAfterTests/Info.plist; 409 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 410 | PRODUCT_NAME = "$(TARGET_NAME)"; 411 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/DataSourceAfter.app/DataSourceAfter"; 412 | }; 413 | name = Release; 414 | }; 415 | /* End XCBuildConfiguration section */ 416 | 417 | /* Begin XCConfigurationList section */ 418 | 73855B8D1A7D807D00E503FA /* Build configuration list for PBXProject "DataSourceAfter" */ = { 419 | isa = XCConfigurationList; 420 | buildConfigurations = ( 421 | 73855BAF1A7D807D00E503FA /* Debug */, 422 | 73855BB01A7D807D00E503FA /* Release */, 423 | ); 424 | defaultConfigurationIsVisible = 0; 425 | defaultConfigurationName = Release; 426 | }; 427 | 73855BB11A7D807D00E503FA /* Build configuration list for PBXNativeTarget "DataSourceAfter" */ = { 428 | isa = XCConfigurationList; 429 | buildConfigurations = ( 430 | 73855BB21A7D807D00E503FA /* Debug */, 431 | 73855BB31A7D807D00E503FA /* Release */, 432 | ); 433 | defaultConfigurationIsVisible = 0; 434 | }; 435 | 73855BB41A7D807D00E503FA /* Build configuration list for PBXNativeTarget "DataSourceAfterTests" */ = { 436 | isa = XCConfigurationList; 437 | buildConfigurations = ( 438 | 73855BB51A7D807D00E503FA /* Debug */, 439 | 73855BB61A7D807D00E503FA /* Release */, 440 | ); 441 | defaultConfigurationIsVisible = 0; 442 | }; 443 | /* End XCConfigurationList section */ 444 | }; 445 | rootObject = 73855B8A1A7D807D00E503FA /* Project object */; 446 | } 447 | -------------------------------------------------------------------------------- /MVVM/MVVMBefore/MVVMBefore.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 736A39621A978CD4000E59E5 /* DataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 736A39611A978CD4000E59E5 /* DataStore.swift */; }; 11 | 73BC46D61A962149008F0C7A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73BC46D51A962149008F0C7A /* AppDelegate.swift */; }; 12 | 73BC46D81A962149008F0C7A /* ShowViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73BC46D71A962149008F0C7A /* ShowViewController.swift */; }; 13 | 73BC46DB1A962149008F0C7A /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 73BC46D91A962149008F0C7A /* Main.storyboard */; }; 14 | 73BC46DD1A962149008F0C7A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 73BC46DC1A962149008F0C7A /* Images.xcassets */; }; 15 | 73BC46E01A962149008F0C7A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 73BC46DE1A962149008F0C7A /* LaunchScreen.xib */; }; 16 | 73BC46EC1A962149008F0C7A /* MVVMBeforeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73BC46EB1A962149008F0C7A /* MVVMBeforeTests.swift */; }; 17 | 73BC46F61A9681F5008F0C7A /* FolderData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73BC46F51A9681F5008F0C7A /* FolderData.swift */; }; 18 | 73BC46F81A968607008F0C7A /* ChangeFolderNameViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73BC46F71A968607008F0C7A /* ChangeFolderNameViewController.swift */; }; 19 | /* End PBXBuildFile section */ 20 | 21 | /* Begin PBXContainerItemProxy section */ 22 | 73BC46E61A962149008F0C7A /* PBXContainerItemProxy */ = { 23 | isa = PBXContainerItemProxy; 24 | containerPortal = 73BC46C81A962149008F0C7A /* Project object */; 25 | proxyType = 1; 26 | remoteGlobalIDString = 73BC46CF1A962149008F0C7A; 27 | remoteInfo = MVVMBefore; 28 | }; 29 | /* End PBXContainerItemProxy section */ 30 | 31 | /* Begin PBXFileReference section */ 32 | 736A39611A978CD4000E59E5 /* DataStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataStore.swift; sourceTree = ""; }; 33 | 73BC46D01A962149008F0C7A /* MVVMBefore.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MVVMBefore.app; sourceTree = BUILT_PRODUCTS_DIR; }; 34 | 73BC46D41A962149008F0C7A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 35 | 73BC46D51A962149008F0C7A /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 36 | 73BC46D71A962149008F0C7A /* ShowViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShowViewController.swift; sourceTree = ""; }; 37 | 73BC46DA1A962149008F0C7A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 38 | 73BC46DC1A962149008F0C7A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 39 | 73BC46DF1A962149008F0C7A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 40 | 73BC46E51A962149008F0C7A /* MVVMBeforeTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MVVMBeforeTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 41 | 73BC46EA1A962149008F0C7A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 42 | 73BC46EB1A962149008F0C7A /* MVVMBeforeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MVVMBeforeTests.swift; sourceTree = ""; }; 43 | 73BC46F51A9681F5008F0C7A /* FolderData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FolderData.swift; sourceTree = ""; }; 44 | 73BC46F71A968607008F0C7A /* ChangeFolderNameViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChangeFolderNameViewController.swift; sourceTree = ""; }; 45 | /* End PBXFileReference section */ 46 | 47 | /* Begin PBXFrameworksBuildPhase section */ 48 | 73BC46CD1A962149008F0C7A /* Frameworks */ = { 49 | isa = PBXFrameworksBuildPhase; 50 | buildActionMask = 2147483647; 51 | files = ( 52 | ); 53 | runOnlyForDeploymentPostprocessing = 0; 54 | }; 55 | 73BC46E21A962149008F0C7A /* Frameworks */ = { 56 | isa = PBXFrameworksBuildPhase; 57 | buildActionMask = 2147483647; 58 | files = ( 59 | ); 60 | runOnlyForDeploymentPostprocessing = 0; 61 | }; 62 | /* End PBXFrameworksBuildPhase section */ 63 | 64 | /* Begin PBXGroup section */ 65 | 736A395E1A978C9C000E59E5 /* Model */ = { 66 | isa = PBXGroup; 67 | children = ( 68 | 73BC46F51A9681F5008F0C7A /* FolderData.swift */, 69 | 736A39611A978CD4000E59E5 /* DataStore.swift */, 70 | ); 71 | name = Model; 72 | sourceTree = ""; 73 | }; 74 | 736A395F1A978CA1000E59E5 /* Controller */ = { 75 | isa = PBXGroup; 76 | children = ( 77 | 73BC46D51A962149008F0C7A /* AppDelegate.swift */, 78 | 73BC46D71A962149008F0C7A /* ShowViewController.swift */, 79 | 73BC46F71A968607008F0C7A /* ChangeFolderNameViewController.swift */, 80 | ); 81 | name = Controller; 82 | sourceTree = ""; 83 | }; 84 | 736A39601A978CB1000E59E5 /* Resources */ = { 85 | isa = PBXGroup; 86 | children = ( 87 | 73BC46D91A962149008F0C7A /* Main.storyboard */, 88 | 73BC46DC1A962149008F0C7A /* Images.xcassets */, 89 | 73BC46DE1A962149008F0C7A /* LaunchScreen.xib */, 90 | ); 91 | name = Resources; 92 | sourceTree = ""; 93 | }; 94 | 73BC46C71A962149008F0C7A = { 95 | isa = PBXGroup; 96 | children = ( 97 | 73BC46D21A962149008F0C7A /* MVVMBefore */, 98 | 73BC46E81A962149008F0C7A /* MVVMBeforeTests */, 99 | 73BC46D11A962149008F0C7A /* Products */, 100 | ); 101 | sourceTree = ""; 102 | }; 103 | 73BC46D11A962149008F0C7A /* Products */ = { 104 | isa = PBXGroup; 105 | children = ( 106 | 73BC46D01A962149008F0C7A /* MVVMBefore.app */, 107 | 73BC46E51A962149008F0C7A /* MVVMBeforeTests.xctest */, 108 | ); 109 | name = Products; 110 | sourceTree = ""; 111 | }; 112 | 73BC46D21A962149008F0C7A /* MVVMBefore */ = { 113 | isa = PBXGroup; 114 | children = ( 115 | 736A395E1A978C9C000E59E5 /* Model */, 116 | 736A395F1A978CA1000E59E5 /* Controller */, 117 | 736A39601A978CB1000E59E5 /* Resources */, 118 | 73BC46D31A962149008F0C7A /* Supporting Files */, 119 | ); 120 | path = MVVMBefore; 121 | sourceTree = ""; 122 | }; 123 | 73BC46D31A962149008F0C7A /* Supporting Files */ = { 124 | isa = PBXGroup; 125 | children = ( 126 | 73BC46D41A962149008F0C7A /* Info.plist */, 127 | ); 128 | name = "Supporting Files"; 129 | sourceTree = ""; 130 | }; 131 | 73BC46E81A962149008F0C7A /* MVVMBeforeTests */ = { 132 | isa = PBXGroup; 133 | children = ( 134 | 73BC46EB1A962149008F0C7A /* MVVMBeforeTests.swift */, 135 | 73BC46E91A962149008F0C7A /* Supporting Files */, 136 | ); 137 | path = MVVMBeforeTests; 138 | sourceTree = ""; 139 | }; 140 | 73BC46E91A962149008F0C7A /* Supporting Files */ = { 141 | isa = PBXGroup; 142 | children = ( 143 | 73BC46EA1A962149008F0C7A /* Info.plist */, 144 | ); 145 | name = "Supporting Files"; 146 | sourceTree = ""; 147 | }; 148 | /* End PBXGroup section */ 149 | 150 | /* Begin PBXNativeTarget section */ 151 | 73BC46CF1A962149008F0C7A /* MVVMBefore */ = { 152 | isa = PBXNativeTarget; 153 | buildConfigurationList = 73BC46EF1A962149008F0C7A /* Build configuration list for PBXNativeTarget "MVVMBefore" */; 154 | buildPhases = ( 155 | 73BC46CC1A962149008F0C7A /* Sources */, 156 | 73BC46CD1A962149008F0C7A /* Frameworks */, 157 | 73BC46CE1A962149008F0C7A /* Resources */, 158 | ); 159 | buildRules = ( 160 | ); 161 | dependencies = ( 162 | ); 163 | name = MVVMBefore; 164 | productName = MVVMBefore; 165 | productReference = 73BC46D01A962149008F0C7A /* MVVMBefore.app */; 166 | productType = "com.apple.product-type.application"; 167 | }; 168 | 73BC46E41A962149008F0C7A /* MVVMBeforeTests */ = { 169 | isa = PBXNativeTarget; 170 | buildConfigurationList = 73BC46F21A962149008F0C7A /* Build configuration list for PBXNativeTarget "MVVMBeforeTests" */; 171 | buildPhases = ( 172 | 73BC46E11A962149008F0C7A /* Sources */, 173 | 73BC46E21A962149008F0C7A /* Frameworks */, 174 | 73BC46E31A962149008F0C7A /* Resources */, 175 | ); 176 | buildRules = ( 177 | ); 178 | dependencies = ( 179 | 73BC46E71A962149008F0C7A /* PBXTargetDependency */, 180 | ); 181 | name = MVVMBeforeTests; 182 | productName = MVVMBeforeTests; 183 | productReference = 73BC46E51A962149008F0C7A /* MVVMBeforeTests.xctest */; 184 | productType = "com.apple.product-type.bundle.unit-test"; 185 | }; 186 | /* End PBXNativeTarget section */ 187 | 188 | /* Begin PBXProject section */ 189 | 73BC46C81A962149008F0C7A /* Project object */ = { 190 | isa = PBXProject; 191 | attributes = { 192 | LastUpgradeCheck = 0630; 193 | ORGANIZATIONNAME = "Gentle Bytes"; 194 | TargetAttributes = { 195 | 73BC46CF1A962149008F0C7A = { 196 | CreatedOnToolsVersion = 6.3; 197 | }; 198 | 73BC46E41A962149008F0C7A = { 199 | CreatedOnToolsVersion = 6.3; 200 | TestTargetID = 73BC46CF1A962149008F0C7A; 201 | }; 202 | }; 203 | }; 204 | buildConfigurationList = 73BC46CB1A962149008F0C7A /* Build configuration list for PBXProject "MVVMBefore" */; 205 | compatibilityVersion = "Xcode 3.2"; 206 | developmentRegion = English; 207 | hasScannedForEncodings = 0; 208 | knownRegions = ( 209 | en, 210 | Base, 211 | ); 212 | mainGroup = 73BC46C71A962149008F0C7A; 213 | productRefGroup = 73BC46D11A962149008F0C7A /* Products */; 214 | projectDirPath = ""; 215 | projectRoot = ""; 216 | targets = ( 217 | 73BC46CF1A962149008F0C7A /* MVVMBefore */, 218 | 73BC46E41A962149008F0C7A /* MVVMBeforeTests */, 219 | ); 220 | }; 221 | /* End PBXProject section */ 222 | 223 | /* Begin PBXResourcesBuildPhase section */ 224 | 73BC46CE1A962149008F0C7A /* Resources */ = { 225 | isa = PBXResourcesBuildPhase; 226 | buildActionMask = 2147483647; 227 | files = ( 228 | 73BC46DB1A962149008F0C7A /* Main.storyboard in Resources */, 229 | 73BC46E01A962149008F0C7A /* LaunchScreen.xib in Resources */, 230 | 73BC46DD1A962149008F0C7A /* Images.xcassets in Resources */, 231 | ); 232 | runOnlyForDeploymentPostprocessing = 0; 233 | }; 234 | 73BC46E31A962149008F0C7A /* Resources */ = { 235 | isa = PBXResourcesBuildPhase; 236 | buildActionMask = 2147483647; 237 | files = ( 238 | ); 239 | runOnlyForDeploymentPostprocessing = 0; 240 | }; 241 | /* End PBXResourcesBuildPhase section */ 242 | 243 | /* Begin PBXSourcesBuildPhase section */ 244 | 73BC46CC1A962149008F0C7A /* Sources */ = { 245 | isa = PBXSourcesBuildPhase; 246 | buildActionMask = 2147483647; 247 | files = ( 248 | 73BC46F81A968607008F0C7A /* ChangeFolderNameViewController.swift in Sources */, 249 | 73BC46D81A962149008F0C7A /* ShowViewController.swift in Sources */, 250 | 73BC46D61A962149008F0C7A /* AppDelegate.swift in Sources */, 251 | 736A39621A978CD4000E59E5 /* DataStore.swift in Sources */, 252 | 73BC46F61A9681F5008F0C7A /* FolderData.swift in Sources */, 253 | ); 254 | runOnlyForDeploymentPostprocessing = 0; 255 | }; 256 | 73BC46E11A962149008F0C7A /* Sources */ = { 257 | isa = PBXSourcesBuildPhase; 258 | buildActionMask = 2147483647; 259 | files = ( 260 | 73BC46EC1A962149008F0C7A /* MVVMBeforeTests.swift in Sources */, 261 | ); 262 | runOnlyForDeploymentPostprocessing = 0; 263 | }; 264 | /* End PBXSourcesBuildPhase section */ 265 | 266 | /* Begin PBXTargetDependency section */ 267 | 73BC46E71A962149008F0C7A /* PBXTargetDependency */ = { 268 | isa = PBXTargetDependency; 269 | target = 73BC46CF1A962149008F0C7A /* MVVMBefore */; 270 | targetProxy = 73BC46E61A962149008F0C7A /* PBXContainerItemProxy */; 271 | }; 272 | /* End PBXTargetDependency section */ 273 | 274 | /* Begin PBXVariantGroup section */ 275 | 73BC46D91A962149008F0C7A /* Main.storyboard */ = { 276 | isa = PBXVariantGroup; 277 | children = ( 278 | 73BC46DA1A962149008F0C7A /* Base */, 279 | ); 280 | name = Main.storyboard; 281 | sourceTree = ""; 282 | }; 283 | 73BC46DE1A962149008F0C7A /* LaunchScreen.xib */ = { 284 | isa = PBXVariantGroup; 285 | children = ( 286 | 73BC46DF1A962149008F0C7A /* Base */, 287 | ); 288 | name = LaunchScreen.xib; 289 | sourceTree = ""; 290 | }; 291 | /* End PBXVariantGroup section */ 292 | 293 | /* Begin XCBuildConfiguration section */ 294 | 73BC46ED1A962149008F0C7A /* Debug */ = { 295 | isa = XCBuildConfiguration; 296 | buildSettings = { 297 | ALWAYS_SEARCH_USER_PATHS = NO; 298 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 299 | CLANG_CXX_LIBRARY = "libc++"; 300 | CLANG_ENABLE_MODULES = YES; 301 | CLANG_ENABLE_OBJC_ARC = YES; 302 | CLANG_WARN_BOOL_CONVERSION = YES; 303 | CLANG_WARN_CONSTANT_CONVERSION = YES; 304 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 305 | CLANG_WARN_EMPTY_BODY = YES; 306 | CLANG_WARN_ENUM_CONVERSION = YES; 307 | CLANG_WARN_INT_CONVERSION = YES; 308 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 309 | CLANG_WARN_UNREACHABLE_CODE = YES; 310 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 311 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 312 | COPY_PHASE_STRIP = NO; 313 | DEBUG_INFORMATION_FORMAT = dwarf; 314 | ENABLE_STRICT_OBJC_MSGSEND = YES; 315 | GCC_C_LANGUAGE_STANDARD = gnu99; 316 | GCC_DYNAMIC_NO_PIC = NO; 317 | GCC_OPTIMIZATION_LEVEL = 0; 318 | GCC_PREPROCESSOR_DEFINITIONS = ( 319 | "DEBUG=1", 320 | "$(inherited)", 321 | ); 322 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 323 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 324 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 325 | GCC_WARN_UNDECLARED_SELECTOR = YES; 326 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 327 | GCC_WARN_UNUSED_FUNCTION = YES; 328 | GCC_WARN_UNUSED_VARIABLE = YES; 329 | IPHONEOS_DEPLOYMENT_TARGET = 8.3; 330 | MTL_ENABLE_DEBUG_INFO = YES; 331 | ONLY_ACTIVE_ARCH = YES; 332 | SDKROOT = iphoneos; 333 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 334 | TARGETED_DEVICE_FAMILY = "1,2"; 335 | }; 336 | name = Debug; 337 | }; 338 | 73BC46EE1A962149008F0C7A /* Release */ = { 339 | isa = XCBuildConfiguration; 340 | buildSettings = { 341 | ALWAYS_SEARCH_USER_PATHS = NO; 342 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 343 | CLANG_CXX_LIBRARY = "libc++"; 344 | CLANG_ENABLE_MODULES = YES; 345 | CLANG_ENABLE_OBJC_ARC = YES; 346 | CLANG_WARN_BOOL_CONVERSION = YES; 347 | CLANG_WARN_CONSTANT_CONVERSION = YES; 348 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 349 | CLANG_WARN_EMPTY_BODY = YES; 350 | CLANG_WARN_ENUM_CONVERSION = YES; 351 | CLANG_WARN_INT_CONVERSION = YES; 352 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 353 | CLANG_WARN_UNREACHABLE_CODE = YES; 354 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 355 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 356 | COPY_PHASE_STRIP = NO; 357 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 358 | ENABLE_NS_ASSERTIONS = NO; 359 | ENABLE_STRICT_OBJC_MSGSEND = YES; 360 | GCC_C_LANGUAGE_STANDARD = gnu99; 361 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 362 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 363 | GCC_WARN_UNDECLARED_SELECTOR = YES; 364 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 365 | GCC_WARN_UNUSED_FUNCTION = YES; 366 | GCC_WARN_UNUSED_VARIABLE = YES; 367 | IPHONEOS_DEPLOYMENT_TARGET = 8.3; 368 | MTL_ENABLE_DEBUG_INFO = NO; 369 | SDKROOT = iphoneos; 370 | TARGETED_DEVICE_FAMILY = "1,2"; 371 | VALIDATE_PRODUCT = YES; 372 | }; 373 | name = Release; 374 | }; 375 | 73BC46F01A962149008F0C7A /* Debug */ = { 376 | isa = XCBuildConfiguration; 377 | buildSettings = { 378 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 379 | INFOPLIST_FILE = MVVMBefore/Info.plist; 380 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 381 | PRODUCT_NAME = "$(TARGET_NAME)"; 382 | }; 383 | name = Debug; 384 | }; 385 | 73BC46F11A962149008F0C7A /* Release */ = { 386 | isa = XCBuildConfiguration; 387 | buildSettings = { 388 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 389 | INFOPLIST_FILE = MVVMBefore/Info.plist; 390 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 391 | PRODUCT_NAME = "$(TARGET_NAME)"; 392 | }; 393 | name = Release; 394 | }; 395 | 73BC46F31A962149008F0C7A /* Debug */ = { 396 | isa = XCBuildConfiguration; 397 | buildSettings = { 398 | BUNDLE_LOADER = "$(TEST_HOST)"; 399 | FRAMEWORK_SEARCH_PATHS = ( 400 | "$(SDKROOT)/Developer/Library/Frameworks", 401 | "$(inherited)", 402 | ); 403 | GCC_PREPROCESSOR_DEFINITIONS = ( 404 | "DEBUG=1", 405 | "$(inherited)", 406 | ); 407 | INFOPLIST_FILE = MVVMBeforeTests/Info.plist; 408 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 409 | PRODUCT_NAME = "$(TARGET_NAME)"; 410 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/MVVMBefore.app/MVVMBefore"; 411 | }; 412 | name = Debug; 413 | }; 414 | 73BC46F41A962149008F0C7A /* Release */ = { 415 | isa = XCBuildConfiguration; 416 | buildSettings = { 417 | BUNDLE_LOADER = "$(TEST_HOST)"; 418 | FRAMEWORK_SEARCH_PATHS = ( 419 | "$(SDKROOT)/Developer/Library/Frameworks", 420 | "$(inherited)", 421 | ); 422 | INFOPLIST_FILE = MVVMBeforeTests/Info.plist; 423 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 424 | PRODUCT_NAME = "$(TARGET_NAME)"; 425 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/MVVMBefore.app/MVVMBefore"; 426 | }; 427 | name = Release; 428 | }; 429 | /* End XCBuildConfiguration section */ 430 | 431 | /* Begin XCConfigurationList section */ 432 | 73BC46CB1A962149008F0C7A /* Build configuration list for PBXProject "MVVMBefore" */ = { 433 | isa = XCConfigurationList; 434 | buildConfigurations = ( 435 | 73BC46ED1A962149008F0C7A /* Debug */, 436 | 73BC46EE1A962149008F0C7A /* Release */, 437 | ); 438 | defaultConfigurationIsVisible = 0; 439 | defaultConfigurationName = Release; 440 | }; 441 | 73BC46EF1A962149008F0C7A /* Build configuration list for PBXNativeTarget "MVVMBefore" */ = { 442 | isa = XCConfigurationList; 443 | buildConfigurations = ( 444 | 73BC46F01A962149008F0C7A /* Debug */, 445 | 73BC46F11A962149008F0C7A /* Release */, 446 | ); 447 | defaultConfigurationIsVisible = 0; 448 | defaultConfigurationName = Release; 449 | }; 450 | 73BC46F21A962149008F0C7A /* Build configuration list for PBXNativeTarget "MVVMBeforeTests" */ = { 451 | isa = XCConfigurationList; 452 | buildConfigurations = ( 453 | 73BC46F31A962149008F0C7A /* Debug */, 454 | 73BC46F41A962149008F0C7A /* Release */, 455 | ); 456 | defaultConfigurationIsVisible = 0; 457 | defaultConfigurationName = Release; 458 | }; 459 | /* End XCConfigurationList section */ 460 | }; 461 | rootObject = 73BC46C81A962149008F0C7A /* Project object */; 462 | } 463 | -------------------------------------------------------------------------------- /MVVM/MVVMAfter/MVVMAfter.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 736A39721A97945A000E59E5 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 736A39711A97945A000E59E5 /* AppDelegate.swift */; }; 11 | 736A39771A97945A000E59E5 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 736A39751A97945A000E59E5 /* Main.storyboard */; }; 12 | 736A39791A97945A000E59E5 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 736A39781A97945A000E59E5 /* Images.xcassets */; }; 13 | 736A397C1A97945A000E59E5 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 736A397A1A97945A000E59E5 /* LaunchScreen.xib */; }; 14 | 736A39881A97945A000E59E5 /* MVVMAfterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 736A39871A97945A000E59E5 /* MVVMAfterTests.swift */; }; 15 | 736A39961A9794D1000E59E5 /* DataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 736A39941A9794D1000E59E5 /* DataStore.swift */; }; 16 | 736A39971A9794D1000E59E5 /* FolderData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 736A39951A9794D1000E59E5 /* FolderData.swift */; }; 17 | 736A399A1A9794D9000E59E5 /* ChangeFolderNameViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 736A39981A9794D9000E59E5 /* ChangeFolderNameViewController.swift */; }; 18 | 736A399B1A9794D9000E59E5 /* ShowViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 736A39991A9794D9000E59E5 /* ShowViewController.swift */; }; 19 | 736A399D1A97950E000E59E5 /* FolderViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 736A399C1A97950E000E59E5 /* FolderViewModel.swift */; }; 20 | /* End PBXBuildFile section */ 21 | 22 | /* Begin PBXContainerItemProxy section */ 23 | 736A39821A97945A000E59E5 /* PBXContainerItemProxy */ = { 24 | isa = PBXContainerItemProxy; 25 | containerPortal = 736A39641A97945A000E59E5 /* Project object */; 26 | proxyType = 1; 27 | remoteGlobalIDString = 736A396B1A97945A000E59E5; 28 | remoteInfo = MVVMAfter; 29 | }; 30 | /* End PBXContainerItemProxy section */ 31 | 32 | /* Begin PBXFileReference section */ 33 | 736A396C1A97945A000E59E5 /* MVVMAfter.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MVVMAfter.app; sourceTree = BUILT_PRODUCTS_DIR; }; 34 | 736A39701A97945A000E59E5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 35 | 736A39711A97945A000E59E5 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 36 | 736A39761A97945A000E59E5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 37 | 736A39781A97945A000E59E5 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 38 | 736A397B1A97945A000E59E5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 39 | 736A39811A97945A000E59E5 /* MVVMAfterTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MVVMAfterTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 40 | 736A39861A97945A000E59E5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 41 | 736A39871A97945A000E59E5 /* MVVMAfterTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MVVMAfterTests.swift; sourceTree = ""; }; 42 | 736A39941A9794D1000E59E5 /* DataStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataStore.swift; sourceTree = ""; }; 43 | 736A39951A9794D1000E59E5 /* FolderData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FolderData.swift; sourceTree = ""; }; 44 | 736A39981A9794D9000E59E5 /* ChangeFolderNameViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChangeFolderNameViewController.swift; sourceTree = ""; }; 45 | 736A39991A9794D9000E59E5 /* ShowViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShowViewController.swift; sourceTree = ""; }; 46 | 736A399C1A97950E000E59E5 /* FolderViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FolderViewModel.swift; sourceTree = ""; }; 47 | /* End PBXFileReference section */ 48 | 49 | /* Begin PBXFrameworksBuildPhase section */ 50 | 736A39691A97945A000E59E5 /* Frameworks */ = { 51 | isa = PBXFrameworksBuildPhase; 52 | buildActionMask = 2147483647; 53 | files = ( 54 | ); 55 | runOnlyForDeploymentPostprocessing = 0; 56 | }; 57 | 736A397E1A97945A000E59E5 /* Frameworks */ = { 58 | isa = PBXFrameworksBuildPhase; 59 | buildActionMask = 2147483647; 60 | files = ( 61 | ); 62 | runOnlyForDeploymentPostprocessing = 0; 63 | }; 64 | /* End PBXFrameworksBuildPhase section */ 65 | 66 | /* Begin PBXGroup section */ 67 | 736A39631A97945A000E59E5 = { 68 | isa = PBXGroup; 69 | children = ( 70 | 736A396E1A97945A000E59E5 /* MVVMAfter */, 71 | 736A39841A97945A000E59E5 /* MVVMAfterTests */, 72 | 736A396D1A97945A000E59E5 /* Products */, 73 | ); 74 | sourceTree = ""; 75 | }; 76 | 736A396D1A97945A000E59E5 /* Products */ = { 77 | isa = PBXGroup; 78 | children = ( 79 | 736A396C1A97945A000E59E5 /* MVVMAfter.app */, 80 | 736A39811A97945A000E59E5 /* MVVMAfterTests.xctest */, 81 | ); 82 | name = Products; 83 | sourceTree = ""; 84 | }; 85 | 736A396E1A97945A000E59E5 /* MVVMAfter */ = { 86 | isa = PBXGroup; 87 | children = ( 88 | 736A39911A9794B0000E59E5 /* Model */, 89 | 736A399E1A97951E000E59E5 /* View Model */, 90 | 736A39921A9794B4000E59E5 /* Controller */, 91 | 736A39931A9794B7000E59E5 /* Resources */, 92 | 736A396F1A97945A000E59E5 /* Supporting Files */, 93 | ); 94 | path = MVVMAfter; 95 | sourceTree = ""; 96 | }; 97 | 736A396F1A97945A000E59E5 /* Supporting Files */ = { 98 | isa = PBXGroup; 99 | children = ( 100 | 736A39701A97945A000E59E5 /* Info.plist */, 101 | ); 102 | name = "Supporting Files"; 103 | sourceTree = ""; 104 | }; 105 | 736A39841A97945A000E59E5 /* MVVMAfterTests */ = { 106 | isa = PBXGroup; 107 | children = ( 108 | 736A39871A97945A000E59E5 /* MVVMAfterTests.swift */, 109 | 736A39851A97945A000E59E5 /* Supporting Files */, 110 | ); 111 | path = MVVMAfterTests; 112 | sourceTree = ""; 113 | }; 114 | 736A39851A97945A000E59E5 /* Supporting Files */ = { 115 | isa = PBXGroup; 116 | children = ( 117 | 736A39861A97945A000E59E5 /* Info.plist */, 118 | ); 119 | name = "Supporting Files"; 120 | sourceTree = ""; 121 | }; 122 | 736A39911A9794B0000E59E5 /* Model */ = { 123 | isa = PBXGroup; 124 | children = ( 125 | 736A39941A9794D1000E59E5 /* DataStore.swift */, 126 | 736A39951A9794D1000E59E5 /* FolderData.swift */, 127 | ); 128 | name = Model; 129 | sourceTree = ""; 130 | }; 131 | 736A39921A9794B4000E59E5 /* Controller */ = { 132 | isa = PBXGroup; 133 | children = ( 134 | 736A39711A97945A000E59E5 /* AppDelegate.swift */, 135 | 736A39991A9794D9000E59E5 /* ShowViewController.swift */, 136 | 736A39981A9794D9000E59E5 /* ChangeFolderNameViewController.swift */, 137 | ); 138 | name = Controller; 139 | sourceTree = ""; 140 | }; 141 | 736A39931A9794B7000E59E5 /* Resources */ = { 142 | isa = PBXGroup; 143 | children = ( 144 | 736A39751A97945A000E59E5 /* Main.storyboard */, 145 | 736A39781A97945A000E59E5 /* Images.xcassets */, 146 | 736A397A1A97945A000E59E5 /* LaunchScreen.xib */, 147 | ); 148 | name = Resources; 149 | sourceTree = ""; 150 | }; 151 | 736A399E1A97951E000E59E5 /* View Model */ = { 152 | isa = PBXGroup; 153 | children = ( 154 | 736A399C1A97950E000E59E5 /* FolderViewModel.swift */, 155 | ); 156 | name = "View Model"; 157 | sourceTree = ""; 158 | }; 159 | /* End PBXGroup section */ 160 | 161 | /* Begin PBXNativeTarget section */ 162 | 736A396B1A97945A000E59E5 /* MVVMAfter */ = { 163 | isa = PBXNativeTarget; 164 | buildConfigurationList = 736A398B1A97945A000E59E5 /* Build configuration list for PBXNativeTarget "MVVMAfter" */; 165 | buildPhases = ( 166 | 736A39681A97945A000E59E5 /* Sources */, 167 | 736A39691A97945A000E59E5 /* Frameworks */, 168 | 736A396A1A97945A000E59E5 /* Resources */, 169 | ); 170 | buildRules = ( 171 | ); 172 | dependencies = ( 173 | ); 174 | name = MVVMAfter; 175 | productName = MVVMAfter; 176 | productReference = 736A396C1A97945A000E59E5 /* MVVMAfter.app */; 177 | productType = "com.apple.product-type.application"; 178 | }; 179 | 736A39801A97945A000E59E5 /* MVVMAfterTests */ = { 180 | isa = PBXNativeTarget; 181 | buildConfigurationList = 736A398E1A97945A000E59E5 /* Build configuration list for PBXNativeTarget "MVVMAfterTests" */; 182 | buildPhases = ( 183 | 736A397D1A97945A000E59E5 /* Sources */, 184 | 736A397E1A97945A000E59E5 /* Frameworks */, 185 | 736A397F1A97945A000E59E5 /* Resources */, 186 | ); 187 | buildRules = ( 188 | ); 189 | dependencies = ( 190 | 736A39831A97945A000E59E5 /* PBXTargetDependency */, 191 | ); 192 | name = MVVMAfterTests; 193 | productName = MVVMAfterTests; 194 | productReference = 736A39811A97945A000E59E5 /* MVVMAfterTests.xctest */; 195 | productType = "com.apple.product-type.bundle.unit-test"; 196 | }; 197 | /* End PBXNativeTarget section */ 198 | 199 | /* Begin PBXProject section */ 200 | 736A39641A97945A000E59E5 /* Project object */ = { 201 | isa = PBXProject; 202 | attributes = { 203 | LastUpgradeCheck = 0630; 204 | ORGANIZATIONNAME = "Gentle Bytes"; 205 | TargetAttributes = { 206 | 736A396B1A97945A000E59E5 = { 207 | CreatedOnToolsVersion = 6.3; 208 | }; 209 | 736A39801A97945A000E59E5 = { 210 | CreatedOnToolsVersion = 6.3; 211 | TestTargetID = 736A396B1A97945A000E59E5; 212 | }; 213 | }; 214 | }; 215 | buildConfigurationList = 736A39671A97945A000E59E5 /* Build configuration list for PBXProject "MVVMAfter" */; 216 | compatibilityVersion = "Xcode 3.2"; 217 | developmentRegion = English; 218 | hasScannedForEncodings = 0; 219 | knownRegions = ( 220 | en, 221 | Base, 222 | ); 223 | mainGroup = 736A39631A97945A000E59E5; 224 | productRefGroup = 736A396D1A97945A000E59E5 /* Products */; 225 | projectDirPath = ""; 226 | projectRoot = ""; 227 | targets = ( 228 | 736A396B1A97945A000E59E5 /* MVVMAfter */, 229 | 736A39801A97945A000E59E5 /* MVVMAfterTests */, 230 | ); 231 | }; 232 | /* End PBXProject section */ 233 | 234 | /* Begin PBXResourcesBuildPhase section */ 235 | 736A396A1A97945A000E59E5 /* Resources */ = { 236 | isa = PBXResourcesBuildPhase; 237 | buildActionMask = 2147483647; 238 | files = ( 239 | 736A39771A97945A000E59E5 /* Main.storyboard in Resources */, 240 | 736A397C1A97945A000E59E5 /* LaunchScreen.xib in Resources */, 241 | 736A39791A97945A000E59E5 /* Images.xcassets in Resources */, 242 | ); 243 | runOnlyForDeploymentPostprocessing = 0; 244 | }; 245 | 736A397F1A97945A000E59E5 /* Resources */ = { 246 | isa = PBXResourcesBuildPhase; 247 | buildActionMask = 2147483647; 248 | files = ( 249 | ); 250 | runOnlyForDeploymentPostprocessing = 0; 251 | }; 252 | /* End PBXResourcesBuildPhase section */ 253 | 254 | /* Begin PBXSourcesBuildPhase section */ 255 | 736A39681A97945A000E59E5 /* Sources */ = { 256 | isa = PBXSourcesBuildPhase; 257 | buildActionMask = 2147483647; 258 | files = ( 259 | 736A399D1A97950E000E59E5 /* FolderViewModel.swift in Sources */, 260 | 736A399B1A9794D9000E59E5 /* ShowViewController.swift in Sources */, 261 | 736A39721A97945A000E59E5 /* AppDelegate.swift in Sources */, 262 | 736A399A1A9794D9000E59E5 /* ChangeFolderNameViewController.swift in Sources */, 263 | 736A39961A9794D1000E59E5 /* DataStore.swift in Sources */, 264 | 736A39971A9794D1000E59E5 /* FolderData.swift in Sources */, 265 | ); 266 | runOnlyForDeploymentPostprocessing = 0; 267 | }; 268 | 736A397D1A97945A000E59E5 /* Sources */ = { 269 | isa = PBXSourcesBuildPhase; 270 | buildActionMask = 2147483647; 271 | files = ( 272 | 736A39881A97945A000E59E5 /* MVVMAfterTests.swift in Sources */, 273 | ); 274 | runOnlyForDeploymentPostprocessing = 0; 275 | }; 276 | /* End PBXSourcesBuildPhase section */ 277 | 278 | /* Begin PBXTargetDependency section */ 279 | 736A39831A97945A000E59E5 /* PBXTargetDependency */ = { 280 | isa = PBXTargetDependency; 281 | target = 736A396B1A97945A000E59E5 /* MVVMAfter */; 282 | targetProxy = 736A39821A97945A000E59E5 /* PBXContainerItemProxy */; 283 | }; 284 | /* End PBXTargetDependency section */ 285 | 286 | /* Begin PBXVariantGroup section */ 287 | 736A39751A97945A000E59E5 /* Main.storyboard */ = { 288 | isa = PBXVariantGroup; 289 | children = ( 290 | 736A39761A97945A000E59E5 /* Base */, 291 | ); 292 | name = Main.storyboard; 293 | sourceTree = ""; 294 | }; 295 | 736A397A1A97945A000E59E5 /* LaunchScreen.xib */ = { 296 | isa = PBXVariantGroup; 297 | children = ( 298 | 736A397B1A97945A000E59E5 /* Base */, 299 | ); 300 | name = LaunchScreen.xib; 301 | sourceTree = ""; 302 | }; 303 | /* End PBXVariantGroup section */ 304 | 305 | /* Begin XCBuildConfiguration section */ 306 | 736A39891A97945A000E59E5 /* Debug */ = { 307 | isa = XCBuildConfiguration; 308 | buildSettings = { 309 | ALWAYS_SEARCH_USER_PATHS = NO; 310 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 311 | CLANG_CXX_LIBRARY = "libc++"; 312 | CLANG_ENABLE_MODULES = YES; 313 | CLANG_ENABLE_OBJC_ARC = YES; 314 | CLANG_WARN_BOOL_CONVERSION = YES; 315 | CLANG_WARN_CONSTANT_CONVERSION = YES; 316 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 317 | CLANG_WARN_EMPTY_BODY = YES; 318 | CLANG_WARN_ENUM_CONVERSION = YES; 319 | CLANG_WARN_INT_CONVERSION = YES; 320 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 321 | CLANG_WARN_UNREACHABLE_CODE = YES; 322 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 323 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 324 | COPY_PHASE_STRIP = NO; 325 | DEBUG_INFORMATION_FORMAT = dwarf; 326 | ENABLE_STRICT_OBJC_MSGSEND = YES; 327 | GCC_C_LANGUAGE_STANDARD = gnu99; 328 | GCC_DYNAMIC_NO_PIC = NO; 329 | GCC_OPTIMIZATION_LEVEL = 0; 330 | GCC_PREPROCESSOR_DEFINITIONS = ( 331 | "DEBUG=1", 332 | "$(inherited)", 333 | ); 334 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 335 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 336 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 337 | GCC_WARN_UNDECLARED_SELECTOR = YES; 338 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 339 | GCC_WARN_UNUSED_FUNCTION = YES; 340 | GCC_WARN_UNUSED_VARIABLE = YES; 341 | IPHONEOS_DEPLOYMENT_TARGET = 8.3; 342 | MTL_ENABLE_DEBUG_INFO = YES; 343 | ONLY_ACTIVE_ARCH = YES; 344 | SDKROOT = iphoneos; 345 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 346 | TARGETED_DEVICE_FAMILY = "1,2"; 347 | }; 348 | name = Debug; 349 | }; 350 | 736A398A1A97945A000E59E5 /* Release */ = { 351 | isa = XCBuildConfiguration; 352 | buildSettings = { 353 | ALWAYS_SEARCH_USER_PATHS = NO; 354 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 355 | CLANG_CXX_LIBRARY = "libc++"; 356 | CLANG_ENABLE_MODULES = YES; 357 | CLANG_ENABLE_OBJC_ARC = YES; 358 | CLANG_WARN_BOOL_CONVERSION = YES; 359 | CLANG_WARN_CONSTANT_CONVERSION = YES; 360 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 361 | CLANG_WARN_EMPTY_BODY = YES; 362 | CLANG_WARN_ENUM_CONVERSION = YES; 363 | CLANG_WARN_INT_CONVERSION = YES; 364 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 365 | CLANG_WARN_UNREACHABLE_CODE = YES; 366 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 367 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 368 | COPY_PHASE_STRIP = NO; 369 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 370 | ENABLE_NS_ASSERTIONS = NO; 371 | ENABLE_STRICT_OBJC_MSGSEND = YES; 372 | GCC_C_LANGUAGE_STANDARD = gnu99; 373 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 374 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 375 | GCC_WARN_UNDECLARED_SELECTOR = YES; 376 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 377 | GCC_WARN_UNUSED_FUNCTION = YES; 378 | GCC_WARN_UNUSED_VARIABLE = YES; 379 | IPHONEOS_DEPLOYMENT_TARGET = 8.3; 380 | MTL_ENABLE_DEBUG_INFO = NO; 381 | SDKROOT = iphoneos; 382 | TARGETED_DEVICE_FAMILY = "1,2"; 383 | VALIDATE_PRODUCT = YES; 384 | }; 385 | name = Release; 386 | }; 387 | 736A398C1A97945A000E59E5 /* Debug */ = { 388 | isa = XCBuildConfiguration; 389 | buildSettings = { 390 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 391 | INFOPLIST_FILE = MVVMAfter/Info.plist; 392 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 393 | PRODUCT_NAME = "$(TARGET_NAME)"; 394 | }; 395 | name = Debug; 396 | }; 397 | 736A398D1A97945A000E59E5 /* Release */ = { 398 | isa = XCBuildConfiguration; 399 | buildSettings = { 400 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 401 | INFOPLIST_FILE = MVVMAfter/Info.plist; 402 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 403 | PRODUCT_NAME = "$(TARGET_NAME)"; 404 | }; 405 | name = Release; 406 | }; 407 | 736A398F1A97945A000E59E5 /* Debug */ = { 408 | isa = XCBuildConfiguration; 409 | buildSettings = { 410 | BUNDLE_LOADER = "$(TEST_HOST)"; 411 | FRAMEWORK_SEARCH_PATHS = ( 412 | "$(SDKROOT)/Developer/Library/Frameworks", 413 | "$(inherited)", 414 | ); 415 | GCC_PREPROCESSOR_DEFINITIONS = ( 416 | "DEBUG=1", 417 | "$(inherited)", 418 | ); 419 | INFOPLIST_FILE = MVVMAfterTests/Info.plist; 420 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 421 | PRODUCT_NAME = "$(TARGET_NAME)"; 422 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/MVVMAfter.app/MVVMAfter"; 423 | }; 424 | name = Debug; 425 | }; 426 | 736A39901A97945A000E59E5 /* Release */ = { 427 | isa = XCBuildConfiguration; 428 | buildSettings = { 429 | BUNDLE_LOADER = "$(TEST_HOST)"; 430 | FRAMEWORK_SEARCH_PATHS = ( 431 | "$(SDKROOT)/Developer/Library/Frameworks", 432 | "$(inherited)", 433 | ); 434 | INFOPLIST_FILE = MVVMAfterTests/Info.plist; 435 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 436 | PRODUCT_NAME = "$(TARGET_NAME)"; 437 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/MVVMAfter.app/MVVMAfter"; 438 | }; 439 | name = Release; 440 | }; 441 | /* End XCBuildConfiguration section */ 442 | 443 | /* Begin XCConfigurationList section */ 444 | 736A39671A97945A000E59E5 /* Build configuration list for PBXProject "MVVMAfter" */ = { 445 | isa = XCConfigurationList; 446 | buildConfigurations = ( 447 | 736A39891A97945A000E59E5 /* Debug */, 448 | 736A398A1A97945A000E59E5 /* Release */, 449 | ); 450 | defaultConfigurationIsVisible = 0; 451 | defaultConfigurationName = Release; 452 | }; 453 | 736A398B1A97945A000E59E5 /* Build configuration list for PBXNativeTarget "MVVMAfter" */ = { 454 | isa = XCConfigurationList; 455 | buildConfigurations = ( 456 | 736A398C1A97945A000E59E5 /* Debug */, 457 | 736A398D1A97945A000E59E5 /* Release */, 458 | ); 459 | defaultConfigurationIsVisible = 0; 460 | }; 461 | 736A398E1A97945A000E59E5 /* Build configuration list for PBXNativeTarget "MVVMAfterTests" */ = { 462 | isa = XCConfigurationList; 463 | buildConfigurations = ( 464 | 736A398F1A97945A000E59E5 /* Debug */, 465 | 736A39901A97945A000E59E5 /* Release */, 466 | ); 467 | defaultConfigurationIsVisible = 0; 468 | }; 469 | /* End XCConfigurationList section */ 470 | }; 471 | rootObject = 736A39641A97945A000E59E5 /* Project object */; 472 | } 473 | --------------------------------------------------------------------------------