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