git.iko.soy/dashared/GDproject
on master help sign in
greate modifications: new profile photos, fixed bugs with channels, added hashtags and new library for them
8056914Darya Rednikina
Cartfile+2−1
@@ -3,4 +3,5 @@ github "ivanbruel/MarkdownKit"
3github "roberthein/TinyConstraints"
3github "roberthein/TinyConstraints"
4github "macteo/Marklight"
4github "macteo/Marklight"
5github "ElaWorkshop/TagListView"
5github "ElaWorkshop/TagListView"
6−github "Alamofire/Alamofire" "5.0.0-beta.2"
6+github "Alamofire/Alamofire" "5.0.0-beta.2"
7+github "whitesmith/WSTagsField"
GDproject.xcodeproj/project.pbxproj+6
@@ -8,6 +8,8 @@
8
8
9/* Begin PBXBuildFile section */
9/* Begin PBXBuildFile section */
10 1210A0BB223940310080686D /* SimplifiedChannelsList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1210A0BA223940310080686D /* SimplifiedChannelsList.swift */; };
10 1210A0BB223940310080686D /* SimplifiedChannelsList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1210A0BA223940310080686D /* SimplifiedChannelsList.swift */; };
11+ 123AD0E3223C1C3900326173 /* WSTagsField.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 123AD0E2223C1C3900326173 /* WSTagsField.framework */; };
12+ 123AD0E5223C1C4300326173 /* WSTagsField.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 123AD0E2223C1C3900326173 /* WSTagsField.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
11 123E37A5221F1B3200F6E42A /* LogInViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 123E37A4221F1B3200F6E42A /* LogInViewController.swift */; };
13 123E37A5221F1B3200F6E42A /* LogInViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 123E37A4221F1B3200F6E42A /* LogInViewController.swift */; };
12 123E37A7221F1DD700F6E42A /* MainController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 123E37A6221F1DD700F6E42A /* MainController.swift */; };
14 123E37A7221F1DD700F6E42A /* MainController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 123E37A6221F1DD700F6E42A /* MainController.swift */; };
13 124CC7032221C00C009DF531 /* Model.swift in Sources */ = {isa = PBXBuildFile; fileRef = 124CC7022221C00C009DF531 /* Model.swift */; };
15 124CC7032221C00C009DF531 /* Model.swift in Sources */ = {isa = PBXBuildFile; fileRef = 124CC7022221C00C009DF531 /* Model.swift */; };
@@ -65,6 +67,7 @@
65 12E36DC4221441EA006FCDD7 /* Cartography.framework in Embed Frameworks */,
67 12E36DC4221441EA006FCDD7 /* Cartography.framework in Embed Frameworks */,
66 12E36DD9221594A9006FCDD7 /* TagListView.framework in Embed Frameworks */,
68 12E36DD9221594A9006FCDD7 /* TagListView.framework in Embed Frameworks */,
67 12E36DBD221441D5006FCDD7 /* TinyConstraints.framework in Embed Frameworks */,
69 12E36DBD221441D5006FCDD7 /* TinyConstraints.framework in Embed Frameworks */,
70+ 123AD0E5223C1C4300326173 /* WSTagsField.framework in Embed Frameworks */,
68 12E36DC2221441E1006FCDD7 /* MarkdownKit.framework in Embed Frameworks */,
71 12E36DC2221441E1006FCDD7 /* MarkdownKit.framework in Embed Frameworks */,
69 );
72 );
70 name = "Embed Frameworks";
73 name = "Embed Frameworks";
@@ -74,6 +77,7 @@
74
77
75/* Begin PBXFileReference section */
78/* Begin PBXFileReference section */
76 1210A0BA223940310080686D /* SimplifiedChannelsList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SimplifiedChannelsList.swift; sourceTree = "<group>"; };
79 1210A0BA223940310080686D /* SimplifiedChannelsList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SimplifiedChannelsList.swift; sourceTree = "<group>"; };
80+ 123AD0E2223C1C3900326173 /* WSTagsField.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WSTagsField.framework; path = Carthage/Build/iOS/WSTagsField.framework; sourceTree = "<group>"; };
77 123E37A4221F1B3200F6E42A /* LogInViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogInViewController.swift; sourceTree = "<group>"; };
81 123E37A4221F1B3200F6E42A /* LogInViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogInViewController.swift; sourceTree = "<group>"; };
78 123E37A6221F1DD700F6E42A /* MainController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainController.swift; sourceTree = "<group>"; };
82 123E37A6221F1DD700F6E42A /* MainController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainController.swift; sourceTree = "<group>"; };
79 124CC7022221C00C009DF531 /* Model.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Model.swift; sourceTree = "<group>"; };
83 124CC7022221C00C009DF531 /* Model.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Model.swift; sourceTree = "<group>"; };
@@ -125,6 +129,7 @@
125 12E36DDB221594B1006FCDD7 /* MarkdownKit.framework in Frameworks */,
129 12E36DDB221594B1006FCDD7 /* MarkdownKit.framework in Frameworks */,
126 12E36DD8221594A9006FCDD7 /* TagListView.framework in Frameworks */,
130 12E36DD8221594A9006FCDD7 /* TagListView.framework in Frameworks */,
127 12E36DAF22143D40006FCDD7 /* Cartography.framework in Frameworks */,
131 12E36DAF22143D40006FCDD7 /* Cartography.framework in Frameworks */,
132+ 123AD0E3223C1C3900326173 /* WSTagsField.framework in Frameworks */,
128 12E36DB322143D4E006FCDD7 /* Marklight.framework in Frameworks */,
133 12E36DB322143D4E006FCDD7 /* Marklight.framework in Frameworks */,
129 );
134 );
130 runOnlyForDeploymentPostprocessing = 0;
135 runOnlyForDeploymentPostprocessing = 0;
@@ -165,6 +170,7 @@
165 12E36D8F221424EA006FCDD7 = {
170 12E36D8F221424EA006FCDD7 = {
166 isa = PBXGroup;
171 isa = PBXGroup;
167 children = (
172 children = (
173+ 123AD0E2223C1C3900326173 /* WSTagsField.framework */,
168 124CC7042221C2BA009DF531 /* Alamofire.framework */,
174 124CC7042221C2BA009DF531 /* Alamofire.framework */,
169 12E36DD622159493006FCDD7 /* TagListView.framework */,
175 12E36DD622159493006FCDD7 /* TagListView.framework */,
170 12E36DB422143D54006FCDD7 /* TinyConstraints.framework */,
176 12E36DB422143D54006FCDD7 /* TinyConstraints.framework */,
GDproject/Base.lproj/Main.storyboard+19−9
@@ -364,23 +364,34 @@
364 <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
364 <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
365 <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
365 <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
366 <subviews>
366 <subviews>
367− <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="sSz-uJ-A7n">
367+ <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="aRT-Du-PVE">
368− <rect key="frame" x="0.0" y="20" width="375" height="647"/>
368+ <rect key="frame" x="0.0" y="55" width="375" height="612"/>
369 <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
369 <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
370 </view>
370 </view>
371+ <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="368-bf-QU6">
372+ <rect key="frame" x="0.0" y="20" width="375" height="35"/>
373+ <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
374+ <constraints>
375+ <constraint firstAttribute="height" constant="35" id="5ER-su-0Yf"/>
376+ </constraints>
377+ </view>
371 </subviews>
378 </subviews>
372 <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
379 <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
373 <constraints>
380 <constraints>
381+ <constraint firstItem="wxD-Ek-mgv" firstAttribute="trailing" secondItem="aRT-Du-PVE" secondAttribute="trailing" id="2ee-e8-G7A"/>
374− <constraint firstItem="sSz-uJ-A7n" firstAttribute="leading" secondItem="wxD-Ek-mgv" secondAttribute="leading" id="2J7-Bi-PzG"/>
382+ <constraint firstItem="368-bf-QU6" firstAttribute="leading" secondItem="wxD-Ek-mgv" secondAttribute="leading" id="9Rl-wh-kZf"/>
375− <constraint firstItem="wxD-Ek-mgv" firstAttribute="trailing" secondItem="sSz-uJ-A7n" secondAttribute="trailing" id="HrU-bs-qsE"/>
383+ <constraint firstItem="aRT-Du-PVE" firstAttribute="leading" secondItem="wxD-Ek-mgv" secondAttribute="leading" id="UBy-Ch-zSL"/>
376− <constraint firstItem="wxD-Ek-mgv" firstAttribute="bottom" secondItem="sSz-uJ-A7n" secondAttribute="bottom" id="oZ7-xQ-9Cb"/>
384+ <constraint firstItem="aRT-Du-PVE" firstAttribute="top" secondItem="368-bf-QU6" secondAttribute="bottom" id="WaE-kh-6w3"/>
377− <constraint firstItem="sSz-uJ-A7n" firstAttribute="top" secondItem="wxD-Ek-mgv" secondAttribute="top" id="zuN-mZ-hgU"/>
385+ <constraint firstItem="368-bf-QU6" firstAttribute="top" secondItem="wxD-Ek-mgv" secondAttribute="top" id="aI9-JQ-7dq"/>
386+ <constraint firstItem="368-bf-QU6" firstAttribute="trailing" secondItem="wxD-Ek-mgv" secondAttribute="trailing" id="haz-0r-Cud"/>
387+ <constraint firstItem="wxD-Ek-mgv" firstAttribute="bottom" secondItem="aRT-Du-PVE" secondAttribute="bottom" id="x3f-eb-ACt"/>
378 </constraints>
388 </constraints>
379 <viewLayoutGuide key="safeArea" id="wxD-Ek-mgv"/>
389 <viewLayoutGuide key="safeArea" id="wxD-Ek-mgv"/>
380 </view>
390 </view>
381 <connections>
391 <connections>
382− <outlet property="bottomTextViewConstraint" destination="oZ7-xQ-9Cb" id="6In-71-0TX"/>
392+ <outlet property="bottomTextViewConstraint" destination="x3f-eb-ACt" id="ktT-im-InH"/>
383− <outlet property="view1" destination="sSz-uJ-A7n" id="5nX-oT-kUi"/>
393+ <outlet property="view1" destination="aRT-Du-PVE" id="m3d-kW-vqW"/>
394+ <outlet property="viewForTags" destination="368-bf-QU6" id="M5s-RZ-Fq7"/>
384 </connections>
395 </connections>
385 </viewController>
396 </viewController>
386 <placeholder placeholderIdentifier="IBFirstResponder" id="3fd-7N-vPg" userLabel="First Responder" sceneMemberID="firstResponder"/>
397 <placeholder placeholderIdentifier="IBFirstResponder" id="3fd-7N-vPg" userLabel="First Responder" sceneMemberID="firstResponder"/>
@@ -517,7 +528,6 @@
517 <objects>
528 <objects>
518 <navigationController storyboardIdentifier="root" id="609-2j-gc9" sceneMemberID="viewController">
529 <navigationController storyboardIdentifier="root" id="609-2j-gc9" sceneMemberID="viewController">
519 <navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="Ah8-NU-AsD">
530 <navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="Ah8-NU-AsD">
520− <rect key="frame" x="0.0" y="20" width="375" height="44"/>
521 <autoresizingMask key="autoresizingMask"/>
531 <autoresizingMask key="autoresizingMask"/>
522 </navigationBar>
532 </navigationBar>
523 </navigationController>
533 </navigationController>
GDproject/Controller/ News and channels/NewPostViewController.swift+75−18
@@ -10,10 +10,15 @@ import UIKit
10import Cartography
10import Cartography
11import Marklight
11import Marklight
12import TinyConstraints
12import TinyConstraints
13+import WSTagsField
13
14
14class NewPostViewController: UIViewController, UITextViewDelegate {
15class NewPostViewController: UIViewController, UITextViewDelegate {
15
16
16 @IBOutlet weak var view1: UIView!
17 @IBOutlet weak var view1: UIView!
18+
19+ @IBOutlet weak var viewForTags: UIView!
20+
21+ fileprivate let tagsField = WSTagsField()
17 // Keep strong instance of the `NSTextStorage` subclass
22 // Keep strong instance of the `NSTextStorage` subclass
18 let textStorage = MarklightTextStorage()
23 let textStorage = MarklightTextStorage()
19
24
@@ -51,8 +56,38 @@ class NewPostViewController: UIViewController, UITextViewDelegate {
51 setUpMD()
56 setUpMD()
52 setUpTextView()
57 setUpTextView()
53 setUpAccessoryView()
58 setUpAccessoryView()
59+ setUpTagsView()
54 }
60 }
55
61
62+ func setUpTagsView(){
63+ tagsField.frame = viewForTags.bounds
64+ viewForTags.addSubview(tagsField)
65+
66+ // tagsField.translatesAutoresizingMaskIntoConstraints = false
67+ // tagsField.heightAnchor.constraint(lessThanOrEqualToConstant: 150).isActive = true
68+
69+ tagsField.cornerRadius = 3.0
70+ tagsField.spaceBetweenLines = 10
71+ tagsField.spaceBetweenTags = 10
72+
73+ //tagsField.numberOfLines = 3
74+ //tagsField.maxHeight = 100.0
75+
76+ tagsField.layoutMargins = UIEdgeInsets(top: 2, left: 6, bottom: 2, right: 6)
77+ tagsField.contentInset = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10) //old padding
78+
79+ tagsField.placeholder = "Enter a tag"
80+ tagsField.placeholderColor = #colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1)
81+ tagsField.placeholderAlwaysVisible = true
82+ tagsField.backgroundColor = #colorLiteral(red: 0.937254902, green: 0.937254902, blue: 0.9568627451, alpha: 1)
83+ tagsField.returnKeyType = .next
84+ tagsField.delimiter = ""
85+
86+ tagsField.textDelegate = self
87+ tagsField.acceptTagOption = .space
88+
89+ textFieldEvents()
90+ }
56
91
57 override func viewWillAppear(_ animated: Bool) {
92 override func viewWillAppear(_ animated: Bool) {
58 super.viewWillAppear(animated)
93 super.viewWillAppear(animated)
@@ -151,23 +186,7 @@ class NewPostViewController: UIViewController, UITextViewDelegate {
151
186
152 @objc func addMathBrackets()
187 @objc func addMathBrackets()
153 {
188 {
154− if textView.text.count != 0 && textView.text.last != "\n" {
189+ // nothing
155− textView.insertText("\n\\[\n ")
156− }
157− else {
158− textView.insertText("\\[\n ")
159− }
160−
161− if let selectedRange = textView.selectedTextRange
162− {
163− textView.insertText("\n\\]\n")
164−
165− if let newPosition = textView.position(from: selectedRange.start, offset: 0)
166− {
167− // set the new position
168− textView.selectedTextRange = textView.textRange(from: newPosition, to: newPosition)
169− }
170− }
171 }
190 }
172
191
173 func setUpMD(){
192 func setUpMD(){
@@ -193,7 +212,7 @@ class NewPostViewController: UIViewController, UITextViewDelegate {
193 var indexOfPost = 0
212 var indexOfPost = 0
194 // MARK:- new post
213 // MARK:- new post
195 @objc func newPost(){
214 @objc func newPost(){
196− Model.createAndPublish(body: [ Model.Attachments(markdown: textView!.text) ], tags: ["ПИ", "люблюСвоюРаботу", "работаРулит", "Шершаков"])
215+ Model.createAndPublish(body: [Model.Attachments(markdown: textView!.text)], tags: tagsField.tags.map { $0.text })
197 // adding row to uiTableView after adding new post
216 // adding row to uiTableView after adding new post
198 // myProtocol?.addPost(post: p)
217 // myProtocol?.addPost(post: p)
199 moveBackToParentVC()
218 moveBackToParentVC()
@@ -255,4 +274,42 @@ class NewPostViewController: UIViewController, UITextViewDelegate {
255 rect.size.height = rect.size.height + textView.textContainerInset.bottom
274 rect.size.height = rect.size.height + textView.textContainerInset.bottom
256 textView.scrollRectToVisible(rect, animated: animated)
275 textView.scrollRectToVisible(rect, animated: animated)
257 }
276 }
277+
278+ fileprivate func textFieldEvents() {
279+ tagsField.onDidAddTag = { _, _ in
280+ print("onDidAddTag")
281+ }
282+
283+ tagsField.onDidRemoveTag = { _, _ in
284+ print("onDidRemoveTag")
285+ }
286+
287+ tagsField.onDidChangeText = { _, text in
288+ print("onDidChangeText")
289+ }
290+
291+ tagsField.onDidChangeHeightTo = { _, height in
292+ print("HeightTo \(height)")
293+ }
294+
295+ tagsField.onDidSelectTagView = { _, tagView in
296+ print("Select \(tagView)")
297+ }
298+
299+ tagsField.onDidUnselectTagView = { _, tagView in
300+ print("Unselect \(tagView)")
301+ }
302+ }
303+}
304+
305+
306+extension NewPostViewController: UITextFieldDelegate {
307+
308+ func textFieldShouldReturn(_ textField: UITextField) -> Bool {
309+ if textField == tagsField {
310+ // hz
311+ }
312+ return true
313+ }
314+
258}
315}
GDproject/Controller/ News and channels/NewsController.swift+13−12
@@ -57,7 +57,7 @@ class NewsController: UITableViewController, UISearchControllerDelegate, NewPost
57 }
57 }
58
58
59 var channel: Model.Channels? {
59 var channel: Model.Channels? {
60− didSet{
60+ didSet {
61 navigationItem.title = channel?.name ?? ""
61 navigationItem.title = channel?.name ?? ""
62 }
62 }
63 }
63 }
@@ -86,7 +86,7 @@ class NewsController: UITableViewController, UISearchControllerDelegate, NewPost
86 tableView.register(PostViewCell.self, forCellReuseIdentifier: postCellId)
86 tableView.register(PostViewCell.self, forCellReuseIdentifier: postCellId)
87 tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
87 tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
88
88
89− setUpSearchContr()
89+ // setUpSearchContr()
90
90
91 news.viewController = self
91 news.viewController = self
92 news.type = .NEWS
92 news.type = .NEWS
@@ -105,12 +105,7 @@ class NewsController: UITableViewController, UISearchControllerDelegate, NewPost
105 }
105 }
106
106
107 @objc func refreshPostsData( _ ff: UIRefreshControl){
107 @objc func refreshPostsData( _ ff: UIRefreshControl){
108− print("I am here")
108+ decideWhatChannelDisplay()
109− Model.getLast { [weak self] (tuple) in
110− self?.posts = tuple.posts
111− self?.dictionary = tuple.users
112− self?.refreshContr.endRefreshing()
113− }
114 }
109 }
115
110
116 deinit {
111 deinit {
@@ -132,24 +127,30 @@ class NewsController: UITableViewController, UISearchControllerDelegate, NewPost
132 searchController.isActive = false
127 searchController.isActive = false
133 // TODO:- display something if no posts are availiable
128 // TODO:- display something if no posts are availiable
134
129
130+ decideWhatChannelDisplay()
131+
132+ // tableView.reloadData()
133+ }
134+
135+ func decideWhatChannelDisplay(){
135 if let channel = channel, let id = channel.id {
136 if let channel = channel, let id = channel.id {
136
137
137 Model.getChannel(with: id) { [weak self] in
138 Model.getChannel(with: id) { [weak self] in
138 self?.posts = $0.posts
139 self?.posts = $0.posts
139 self?.dictionary = $0.users
140 self?.dictionary = $0.users
141+ self?.refreshContr.endRefreshing()
140 }
142 }
141
143
142− } else{
144+ } else {
143
145
144− navigationItem.title = "@&% General"
145 Model.getLast { [weak self] in
146 Model.getLast { [weak self] in
146 self?.posts = $0.posts
147 self?.posts = $0.posts
147 self?.dictionary = $0.users
148 self?.dictionary = $0.users
149+ self?.refreshContr.endRefreshing()
150+ self?.navigationItem.title = "General"
148 }
151 }
149
152
150 }
153 }
151−
152− // tableView.reloadData()
153 }
154 }
154
155
155 func setUpNavigationItemsforPosts(){
156 func setUpNavigationItemsforPosts(){
GDproject/Controller/Profile/ProfileViewController.swift+4−3
@@ -30,14 +30,15 @@ class ProfileViewController: UIViewController
30
30
31 @IBOutlet weak var newMessageButton: UIButton!
31 @IBOutlet weak var newMessageButton: UIButton!
32
32
33+ var protoDictionary: [Int: UIImage] = [9: #imageLiteral(resourceName: "9"), 5051: #imageLiteral(resourceName: "5051"), 69: #imageLiteral(resourceName: "69"), 42: #imageLiteral(resourceName: "42")]
33
34
34 func fill(with user: Model.Users){
35 func fill(with user: Model.Users){
35 self.facultyLabel.text = "Студент: Факультет Компьютерных Наук"
36 self.facultyLabel.text = "Студент: Факультет Компьютерных Наук"
36 self.nameLabel.text = "\(user.firstName) \(user.middleName)"
37 self.nameLabel.text = "\(user.firstName) \(user.middleName)"
37 self.surnameLabel.text = "\(user.lastName)"
38 self.surnameLabel.text = "\(user.lastName)"
38− self.profileImageView.image = #imageLiteral(resourceName: "kitten").roundedImage
39+ self.profileImageView.image = protoDictionary[user.id]?.roundedImage
39 self.placeLabel.text = "📍Москва, Кочновский пр.3"
40 self.placeLabel.text = "📍Москва, Кочновский пр.3"
40− if user.id == DataStorage.standard.getUserId(){
41+ if user.id == DataStorage.standard.getUserId() {
41 newMessageButton.isHidden = true
42 newMessageButton.isHidden = true
42 } else {
43 } else {
43 newMessageButton.isHidden = false
44 newMessageButton.isHidden = false
@@ -50,7 +51,7 @@ class ProfileViewController: UIViewController
50 Model.getPostsForUser(with: user!.id) { [weak self] (posts) in
51 Model.getPostsForUser(with: user!.id) { [weak self] (posts) in
51 self?.dataSourse = posts
52 self?.dataSourse = posts
52 }
53 }
53− navigationItem.title = "\(user?.id ?? 0)"
54+ navigationItem.title = "\(user!.firstName) \(user!.lastName)"
54 }
55 }
55 }
56 }
56
57
GDproject/Supporting files/Assets.xcassets/42.imageset/42.pngnew file

Binary file not shown.

GDproject/Supporting files/Assets.xcassets/42.imageset/Contents.jsonnew file+21
@@ -0,0 +1,21 @@
1+{
2+ "images" : [
3+ {
4+ "idiom" : "universal",
5+ "filename" : "42.png",
6+ "scale" : "1x"
7+ },
8+ {
9+ "idiom" : "universal",
10+ "scale" : "2x"
11+ },
12+ {
13+ "idiom" : "universal",
14+ "scale" : "3x"
15+ }
16+ ],
17+ "info" : {
18+ "version" : 1,
19+ "author" : "xcode"
20+ }
21+}
GDproject/Supporting files/Assets.xcassets/5051.imageset/5051.pngnew file

Binary file not shown.

GDproject/Supporting files/Assets.xcassets/5051.imageset/Contents.jsonnew file+21
@@ -0,0 +1,21 @@
1+{
2+ "images" : [
3+ {
4+ "idiom" : "universal",
5+ "filename" : "5051.png",
6+ "scale" : "1x"
7+ },
8+ {
9+ "idiom" : "universal",
10+ "scale" : "2x"
11+ },
12+ {
13+ "idiom" : "universal",
14+ "scale" : "3x"
15+ }
16+ ],
17+ "info" : {
18+ "version" : 1,
19+ "author" : "xcode"
20+ }
21+}
GDproject/Supporting files/Assets.xcassets/69.imageset/69.pngnew file

Binary file not shown.

GDproject/Supporting files/Assets.xcassets/69.imageset/Contents.jsonnew file+21
@@ -0,0 +1,21 @@
1+{
2+ "images" : [
3+ {
4+ "idiom" : "universal",
5+ "filename" : "69.png",
6+ "scale" : "1x"
7+ },
8+ {
9+ "idiom" : "universal",
10+ "scale" : "2x"
11+ },
12+ {
13+ "idiom" : "universal",
14+ "scale" : "3x"
15+ }
16+ ],
17+ "info" : {
18+ "version" : 1,
19+ "author" : "xcode"
20+ }
21+}
GDproject/Supporting files/Assets.xcassets/9.imageset/9.pngnew file

Binary file not shown.

GDproject/Supporting files/Assets.xcassets/9.imageset/Contents.jsonnew file+21
@@ -0,0 +1,21 @@
1+{
2+ "images" : [
3+ {
4+ "idiom" : "universal",
5+ "filename" : "9.png",
6+ "scale" : "1x"
7+ },
8+ {
9+ "idiom" : "universal",
10+ "scale" : "2x"
11+ },
12+ {
13+ "idiom" : "universal",
14+ "scale" : "3x"
15+ }
16+ ],
17+ "info" : {
18+ "version" : 1,
19+ "author" : "xcode"
20+ }
21+}