Skip to content

Commit a47c3c6

Browse files
committed
Merge branch 'feature/blending-cultures' into develop
2 parents 4af0b03 + 815fa11 commit a47c3c6

13 files changed

+670
-90
lines changed

iCookTV.xcodeproj/project.pbxproj

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,14 @@
1414
B500D9AF1CBA3B7900622198 /* LaunchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B500D9AE1CBA3B7900622198 /* LaunchViewController.swift */; };
1515
B50BFC051CC88FA3004F853D /* Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = B50BFC041CC88FA3004F853D /* Debug.swift */; };
1616
B50BFC071CC8AF14004F853D /* HistoryViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B50BFC061CC8AF14004F853D /* HistoryViewController.swift */; };
17+
B516E78B1D54D73B00A3FCB9 /* SourceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = B516E78A1D54D73B00A3FCB9 /* SourceType.swift */; };
1718
B51A95391CCF1C5100E5ED97 /* iCookTVKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = B51A95381CCF1C5100E5ED97 /* iCookTVKeys.swift */; };
19+
B52BD6731D5F910D0023D4E9 /* VideosCollection.swift in Sources */ = {isa = PBXBuildFile; fileRef = B52BD6721D5F910D0023D4E9 /* VideosCollection.swift */; };
20+
B52BD6751D5F94320023D4E9 /* DataCollection.swift in Sources */ = {isa = PBXBuildFile; fileRef = B52BD6741D5F94320023D4E9 /* DataCollection.swift */; };
21+
B52BD6771D5FA2570023D4E9 /* CategoriesCollection.swift in Sources */ = {isa = PBXBuildFile; fileRef = B52BD6761D5FA2570023D4E9 /* CategoriesCollection.swift */; };
22+
B52BD6791D6024D30023D4E9 /* DataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = B52BD6781D6024D30023D4E9 /* DataSource.swift */; };
23+
B52BD67F1D6034A10023D4E9 /* DataSourceSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = B52BD67E1D6034A10023D4E9 /* DataSourceSpec.swift */; };
24+
B52BD6811D60B62E0023D4E9 /* DataCollectionSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = B52BD6801D60B62E0023D4E9 /* DataCollectionSpec.swift */; };
1825
B52EC3B11CB26F1B0072762C /* CGRect+Grid.swift in Sources */ = {isa = PBXBuildFile; fileRef = B52EC3B01CB26F1B0072762C /* CGRect+Grid.swift */; };
1926
B52EC3B31CB3A02E0072762C /* UIFont+TV.swift in Sources */ = {isa = PBXBuildFile; fileRef = B52EC3B21CB3A02E0072762C /* UIFont+TV.swift */; };
2027
B53115931CC69E7C00E75292 /* HistoryManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = B53115921CC69E7C00E75292 /* HistoryManager.swift */; };
@@ -36,6 +43,8 @@
3643
B5761A5C1CCF6D78008CCC08 /* Video.json in Resources */ = {isa = PBXBuildFile; fileRef = B5761A5B1CCF6D78008CCC08 /* Video.json */; };
3744
B586EFDB1CCA21B300EA8218 /* InsetLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B586EFDA1CCA21B300EA8218 /* InsetLabel.swift */; };
3845
B58DE38B1CB8B54200C00266 /* CoverBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58DE38A1CB8B54200C00266 /* CoverBuilder.swift */; };
46+
B58E906D1D5F806600AC184D /* VideosDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58E906C1D5F806600AC184D /* VideosDataSource.swift */; };
47+
B594CB3B1D53998900CB5630 /* CategoriesDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = B594CB3A1D53998900CB5630 /* CategoriesDataSource.swift */; };
3948
B5A614F71CCA05B4004A3CD5 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = B5A614F91CCA05B4004A3CD5 /* InfoPlist.strings */; };
4049
B5A8F7091CA259120069F836 /* CategoryCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5A8F7081CA259120069F836 /* CategoryCell.swift */; };
4150
B5AEEE321C82D4BC001CF112 /* Metrics.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5AEEE311C82D4BC001CF112 /* Metrics.swift */; };
@@ -78,7 +87,14 @@
7887
B500D9AE1CBA3B7900622198 /* LaunchViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LaunchViewController.swift; sourceTree = "<group>"; };
7988
B50BFC041CC88FA3004F853D /* Debug.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Debug.swift; sourceTree = "<group>"; };
8089
B50BFC061CC8AF14004F853D /* HistoryViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HistoryViewController.swift; sourceTree = "<group>"; };
90+
B516E78A1D54D73B00A3FCB9 /* SourceType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SourceType.swift; sourceTree = "<group>"; };
8191
B51A95381CCF1C5100E5ED97 /* iCookTVKeys.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = iCookTVKeys.swift; sourceTree = "<group>"; };
92+
B52BD6721D5F910D0023D4E9 /* VideosCollection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VideosCollection.swift; sourceTree = "<group>"; };
93+
B52BD6741D5F94320023D4E9 /* DataCollection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataCollection.swift; sourceTree = "<group>"; };
94+
B52BD6761D5FA2570023D4E9 /* CategoriesCollection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CategoriesCollection.swift; sourceTree = "<group>"; };
95+
B52BD6781D6024D30023D4E9 /* DataSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataSource.swift; sourceTree = "<group>"; };
96+
B52BD67E1D6034A10023D4E9 /* DataSourceSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataSourceSpec.swift; sourceTree = "<group>"; };
97+
B52BD6801D60B62E0023D4E9 /* DataCollectionSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataCollectionSpec.swift; sourceTree = "<group>"; };
8298
B52EC3B01CB26F1B0072762C /* CGRect+Grid.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CGRect+Grid.swift"; sourceTree = "<group>"; };
8399
B52EC3B21CB3A02E0072762C /* UIFont+TV.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIFont+TV.swift"; sourceTree = "<group>"; };
84100
B53115921CC69E7C00E75292 /* HistoryManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HistoryManager.swift; sourceTree = "<group>"; };
@@ -100,6 +116,8 @@
100116
B5761A5B1CCF6D78008CCC08 /* Video.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = Video.json; sourceTree = "<group>"; };
101117
B586EFDA1CCA21B300EA8218 /* InsetLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InsetLabel.swift; sourceTree = "<group>"; };
102118
B58DE38A1CB8B54200C00266 /* CoverBuilder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoverBuilder.swift; sourceTree = "<group>"; };
119+
B58E906C1D5F806600AC184D /* VideosDataSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VideosDataSource.swift; sourceTree = "<group>"; };
120+
B594CB3A1D53998900CB5630 /* CategoriesDataSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CategoriesDataSource.swift; sourceTree = "<group>"; };
103121
B5A614F81CCA05B4004A3CD5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/InfoPlist.strings; sourceTree = "<group>"; };
104122
B5A614FA1CCA05B6004A3CD5 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
105123
B5A614FB1CCA05B7004A3CD5 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
@@ -171,7 +189,9 @@
171189
B543C3EB1CD1E93B008C512B /* Protocol */ = {
172190
isa = PBXGroup;
173191
children = (
192+
B52BD6741D5F94320023D4E9 /* DataCollection.swift */,
174193
B543C3E91CD1E85E008C512B /* OverlayEnabled.swift */,
194+
B516E78A1D54D73B00A3FCB9 /* SourceType.swift */,
175195
B5501BE81CD8ACEC001C3281 /* Trackable.swift */,
176196
);
177197
name = Protocol;
@@ -203,6 +223,7 @@
203223
children = (
204224
B5AAAE5D1C85DD1D002DDFC8 /* Controller */,
205225
B53E39791CA1494600EB1EEE /* Extension */,
226+
B5D036581D54E96900B80CFC /* Helper */,
206227
B5AAAE5B1C85DD0A002DDFC8 /* Model */,
207228
B543C3EB1CD1E93B008C512B /* Protocol */,
208229
B5AAAE5C1C85DD16002DDFC8 /* View */,
@@ -217,12 +238,13 @@
217238
B5AAAE5B1C85DD0A002DDFC8 /* Model */ = {
218239
isa = PBXGroup;
219240
children = (
241+
B52BD6761D5FA2570023D4E9 /* CategoriesCollection.swift */,
242+
B594CB3A1D53998900CB5630 /* CategoriesDataSource.swift */,
220243
B56D68E81CA564B00097D5D7 /* Category.swift */,
221-
B58DE38A1CB8B54200C00266 /* CoverBuilder.swift */,
222-
B543C3EE1CD1FD0B008C512B /* GroundControl.swift */,
223-
B53115921CC69E7C00E75292 /* HistoryManager.swift */,
224-
B543C3F01CD21530008C512B /* Tracker.swift */,
244+
B52BD6781D6024D30023D4E9 /* DataSource.swift */,
225245
B5BA618A1C7748B900548B38 /* Video.swift */,
246+
B52BD6721D5F910D0023D4E9 /* VideosCollection.swift */,
247+
B58E906C1D5F806600AC184D /* VideosDataSource.swift */,
226248
);
227249
name = Model;
228250
sourceTree = "<group>";
@@ -256,6 +278,17 @@
256278
name = Controller;
257279
sourceTree = "<group>";
258280
};
281+
B5D036581D54E96900B80CFC /* Helper */ = {
282+
isa = PBXGroup;
283+
children = (
284+
B58DE38A1CB8B54200C00266 /* CoverBuilder.swift */,
285+
B543C3EE1CD1FD0B008C512B /* GroundControl.swift */,
286+
B53115921CC69E7C00E75292 /* HistoryManager.swift */,
287+
B543C3F01CD21530008C512B /* Tracker.swift */,
288+
);
289+
name = Helper;
290+
sourceTree = "<group>";
291+
};
259292
B5F7BF3F1BA9C95F00A75099 = {
260293
isa = PBXGroup;
261294
children = (
@@ -291,6 +324,8 @@
291324
children = (
292325
B5761A541CCF555D008CCC08 /* Supporting Files */,
293326
B5761A521CCF4D3D008CCC08 /* CategorySpec.swift */,
327+
B52BD6801D60B62E0023D4E9 /* DataCollectionSpec.swift */,
328+
B52BD67E1D6034A10023D4E9 /* DataSourceSpec.swift */,
294329
B5F7BF5D1BA9C95F00A75099 /* iCookTVTests.swift */,
295330
B5761A571CCF5752008CCC08 /* ResourceHelper.swift */,
296331
B5761A591CCF6CCD008CCC08 /* VideoSpec.swift */,
@@ -558,12 +593,16 @@
558593
files = (
559594
B5F7BF4C1BA9C95F00A75099 /* AppDelegate.swift in Sources */,
560595
B5DA8EE21CB4C2B20068E0E3 /* BlurBackgroundViewController.swift in Sources */,
596+
B52BD6771D5FA2570023D4E9 /* CategoriesCollection.swift in Sources */,
597+
B594CB3B1D53998900CB5630 /* CategoriesDataSource.swift in Sources */,
561598
B53E397B1CA14B4200EB1EEE /* CategoriesViewController.swift in Sources */,
562599
B56D68E91CA564B00097D5D7 /* Category.swift in Sources */,
563600
B5A8F7091CA259120069F836 /* CategoryCell.swift in Sources */,
564601
B5C591151CA04BA50096B985 /* CategoryHeaderView.swift in Sources */,
565602
B52EC3B11CB26F1B0072762C /* CGRect+Grid.swift in Sources */,
566603
B58DE38B1CB8B54200C00266 /* CoverBuilder.swift in Sources */,
604+
B52BD6751D5F94320023D4E9 /* DataCollection.swift in Sources */,
605+
B52BD6791D6024D30023D4E9 /* DataSource.swift in Sources */,
567606
B50BFC051CC88FA3004F853D /* Debug.swift in Sources */,
568607
B543C3ED1CD1EF26008C512B /* EmptyStateView.swift in Sources */,
569608
B543C3EF1CD1FD0B008C512B /* GroundControl.swift in Sources */,
@@ -578,6 +617,7 @@
578617
B5AEEE321C82D4BC001CF112 /* Metrics.swift in Sources */,
579618
B543C3EA1CD1E85E008C512B /* OverlayEnabled.swift in Sources */,
580619
B5BA3B4C1CF6D25500B0A022 /* R.generated.swift in Sources */,
620+
B516E78B1D54D73B00A3FCB9 /* SourceType.swift in Sources */,
581621
B5501BE91CD8ACEC001C3281 /* Trackable.swift in Sources */,
582622
B5501BE31CD74206001C3281 /* TrackableNavigationController.swift in Sources */,
583623
B543C3F11CD21530008C512B /* Tracker.swift in Sources */,
@@ -589,6 +629,8 @@
589629
B5BA618B1C7748B900548B38 /* Video.swift in Sources */,
590630
B5BA61891C77431400548B38 /* VideoCell.swift in Sources */,
591631
B5BA618D1C774BC400548B38 /* VideoPlayerController.swift in Sources */,
632+
B52BD6731D5F910D0023D4E9 /* VideosCollection.swift in Sources */,
633+
B58E906D1D5F806600AC184D /* VideosDataSource.swift in Sources */,
592634
B5DCF9341C985E1600D19FC0 /* VideosViewController.swift in Sources */,
593635
);
594636
runOnlyForDeploymentPostprocessing = 0;
@@ -598,6 +640,8 @@
598640
buildActionMask = 2147483647;
599641
files = (
600642
B5761A531CCF4D3D008CCC08 /* CategorySpec.swift in Sources */,
643+
B52BD6811D60B62E0023D4E9 /* DataCollectionSpec.swift in Sources */,
644+
B52BD67F1D6034A10023D4E9 /* DataSourceSpec.swift in Sources */,
601645
B5F7BF5E1BA9C95F00A75099 /* iCookTVTests.swift in Sources */,
602646
B5761A581CCF5752008CCC08 /* ResourceHelper.swift in Sources */,
603647
B5761A5A1CCF6CCD008CCC08 /* VideoSpec.swift in Sources */,

iCookTV/CategoriesCollection.swift

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
//
2+
// CategoriesCollection.swift
3+
// TryTVOS
4+
//
5+
// Created by Ben on 14/08/2016.
6+
// Copyright © 2016 bcylin.
7+
//
8+
// Permission is hereby granted, free of charge, to any person obtaining a copy
9+
// of this software and associated documentation files (the "Software"), to deal
10+
// in the Software without restriction, including without limitation the rights
11+
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12+
// copies of the Software, and to permit persons to whom the Software is
13+
// furnished to do so, subject to the following conditions:
14+
//
15+
// The above copyright notice and this permission notice shall be included in all
16+
// copies or substantial portions of the Software.
17+
//
18+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24+
// SOFTWARE.
25+
//
26+
27+
import Foundation
28+
29+
struct CategoriesCollection: DataCollection {
30+
31+
typealias DataType = Category
32+
33+
private(set) var items: [Category]
34+
35+
}

iCookTV/CategoriesDataSource.swift

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
//
2+
// CategoriesDataSource.swift
3+
// TryTVOS
4+
//
5+
// Created by Ben on 04/08/2016.
6+
// Copyright © 2016 bcylin.
7+
//
8+
// Permission is hereby granted, free of charge, to any person obtaining a copy
9+
// of this software and associated documentation files (the "Software"), to deal
10+
// in the Software without restriction, including without limitation the rights
11+
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12+
// copies of the Software, and to permit persons to whom the Software is
13+
// furnished to do so, subject to the following conditions:
14+
//
15+
// The above copyright notice and this permission notice shall be included in all
16+
// copies or substantial portions of the Software.
17+
//
18+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24+
// SOFTWARE.
25+
//
26+
27+
import UIKit
28+
29+
class CategoriesDataSource: DataSource<CategoriesCollection> {
30+
31+
// MARK: - Initialization
32+
33+
init(categories: [Category]) {
34+
super.init(dataCollection: CategoriesCollection(items: categories))
35+
}
36+
37+
// MARK: - UICollectionViewDataSource
38+
39+
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
40+
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(NSStringFromClass(CategoryCell.self), forIndexPath: indexPath)
41+
(cell as? CategoryCell)?.configure(withCategory: dataCollection[indexPath.row])
42+
return cell
43+
}
44+
45+
}

iCookTV/CategoriesViewController.swift

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,11 @@
2727
import UIKit
2828

2929
class CategoriesViewController: BlurBackgroundViewController,
30-
UICollectionViewDataSource,
3130
UICollectionViewDelegate,
3231
UICollectionViewDelegateFlowLayout,
3332
Trackable {
3433

35-
private var categories = [Category]() {
34+
private var dataSource: CategoriesDataSource {
3635
didSet {
3736
collectionView.reloadData()
3837
}
@@ -49,16 +48,21 @@ class CategoriesViewController: BlurBackgroundViewController,
4948
let _collectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: Metrics.showcaseLayout)
5049
_collectionView.registerClass(CategoryCell.self, forCellWithReuseIdentifier: NSStringFromClass(CategoryCell.self))
5150
_collectionView.remembersLastFocusedIndexPath = true
52-
_collectionView.dataSource = self
51+
_collectionView.dataSource = self.dataSource
5352
_collectionView.delegate = self
5453
return _collectionView
5554
}()
5655

5756
// MARK: - Initialization
5857

59-
convenience init(categories: [Category]) {
60-
self.init()
61-
self.categories = categories
58+
init(categories: [Category]) {
59+
dataSource = CategoriesDataSource(categories: categories)
60+
super.init(nibName: nil, bundle: nil)
61+
}
62+
63+
required init?(coder aDecoder: NSCoder) {
64+
dataSource = CategoriesDataSource(categories: [])
65+
super.init(coder: aDecoder)
6266
}
6367

6468
// MARK: - UIViewController
@@ -93,23 +97,10 @@ class CategoriesViewController: BlurBackgroundViewController,
9397
return collectionView
9498
}
9599

96-
// MARK: - UICollectionViewDataSource
97-
98-
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
99-
return categories.count
100-
}
101-
102-
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
103-
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(NSStringFromClass(CategoryCell.self), forIndexPath: indexPath)
104-
let category = categories[indexPath.row]
105-
(cell as? CategoryCell)?.configure(withCategory: category)
106-
return cell
107-
}
108-
109100
// MARK: - UICollectionViewDelegate
110101

111102
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
112-
let category = categories[indexPath.row]
103+
let category = dataSource[indexPath.row]
113104
let controller = VideosViewController(categoryID: category.id, title: category.name)
114105
navigationController?.pushViewController(controller, animated: true)
115106
}

0 commit comments

Comments
 (0)