Skip to content

Commit c604254

Browse files
committed
Add "SwiftUI Essentials" > "Handling User Input"
1 parent 93c8313 commit c604254

File tree

9 files changed

+198
-100
lines changed

9 files changed

+198
-100
lines changed

SwiftUI-Tutorials.xcodeproj/project.pbxproj

Lines changed: 56 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,20 @@
77
objects = {
88

99
/* Begin PBXBuildFile section */
10+
36A89B9622AACB3B0096F89A /* UserData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36A89B9522AACB3B0096F89A /* UserData.swift */; };
11+
36A89BA422AACDE40096F89A /* lakemcdonald.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 36A89B9722AACDE30096F89A /* lakemcdonald.jpg */; };
12+
36A89BA522AACDE40096F89A /* chincoteague.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 36A89B9822AACDE30096F89A /* chincoteague.jpg */; };
13+
36A89BA622AACDE40096F89A /* chilkoottrail.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 36A89B9922AACDE30096F89A /* chilkoottrail.jpg */; };
14+
36A89BA722AACDE40096F89A /* landmarkData.json in Resources */ = {isa = PBXBuildFile; fileRef = 36A89B9A22AACDE30096F89A /* landmarkData.json */; };
15+
36A89BA822AACDE40096F89A /* icybay.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 36A89B9B22AACDE30096F89A /* icybay.jpg */; };
16+
36A89BA922AACDE40096F89A /* turtlerock.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 36A89B9C22AACDE30096F89A /* turtlerock.jpg */; };
17+
36A89BAA22AACDE40096F89A /* rainbowlake.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 36A89B9D22AACDE30096F89A /* rainbowlake.jpg */; };
18+
36A89BAB22AACDE40096F89A /* charleyrivers.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 36A89B9E22AACDE30096F89A /* charleyrivers.jpg */; };
19+
36A89BAC22AACDE40096F89A /* twinlake.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 36A89B9F22AACDE30096F89A /* twinlake.jpg */; };
20+
36A89BAD22AACDE40096F89A /* stmarylake.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 36A89BA022AACDE40096F89A /* stmarylake.jpg */; };
21+
36A89BAE22AACDE40096F89A /* umbagog.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 36A89BA122AACDE40096F89A /* umbagog.jpg */; };
22+
36A89BAF22AACDE40096F89A /* silversalmoncreek.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 36A89BA222AACDE40096F89A /* silversalmoncreek.jpg */; };
23+
36A89BB022AACDE40096F89A /* hiddenlake.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 36A89BA322AACDE40096F89A /* hiddenlake.jpg */; };
1024
36C193F722A8F28C00966915 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36C193F622A8F28C00966915 /* AppDelegate.swift */; };
1125
36C193F922A8F28C00966915 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36C193F822A8F28C00966915 /* SceneDelegate.swift */; };
1226
36C193FD22A8F29100966915 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 36C193FC22A8F29100966915 /* Assets.xcassets */; };
@@ -16,25 +30,26 @@
1630
36C1941122A8F30800966915 /* CircleImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36C1940E22A8F30800966915 /* CircleImage.swift */; };
1731
36E2C6C522AA5B990037499F /* Data.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36E2C6C322AA5B990037499F /* Data.swift */; };
1832
36E2C6C622AA5B990037499F /* Landmark.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36E2C6C422AA5B990037499F /* Landmark.swift */; };
19-
36E2C6D522AA5BAE0037499F /* turtlerock.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 36E2C6C822AA5BAE0037499F /* turtlerock.jpg */; };
20-
36E2C6D622AA5BAE0037499F /* silversalmoncreek.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 36E2C6C922AA5BAE0037499F /* silversalmoncreek.jpg */; };
21-
36E2C6D722AA5BAE0037499F /* icybay.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 36E2C6CA22AA5BAE0037499F /* icybay.jpg */; };
22-
36E2C6D822AA5BAE0037499F /* lakemcdonald.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 36E2C6CB22AA5BAE0037499F /* lakemcdonald.jpg */; };
23-
36E2C6D922AA5BAE0037499F /* hiddenlake.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 36E2C6CC22AA5BAE0037499F /* hiddenlake.jpg */; };
24-
36E2C6DA22AA5BAE0037499F /* twinlake.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 36E2C6CD22AA5BAE0037499F /* twinlake.jpg */; };
25-
36E2C6DB22AA5BAE0037499F /* umbagog.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 36E2C6CE22AA5BAE0037499F /* umbagog.jpg */; };
26-
36E2C6DC22AA5BAE0037499F /* landmarkData.json in Resources */ = {isa = PBXBuildFile; fileRef = 36E2C6CF22AA5BAE0037499F /* landmarkData.json */; };
27-
36E2C6DD22AA5BAE0037499F /* chincoteague.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 36E2C6D022AA5BAE0037499F /* chincoteague.jpg */; };
28-
36E2C6DE22AA5BAE0037499F /* yukon_charleyrivers.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 36E2C6D122AA5BAE0037499F /* yukon_charleyrivers.jpg */; };
29-
36E2C6DF22AA5BAE0037499F /* stmarylake.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 36E2C6D222AA5BAE0037499F /* stmarylake.jpg */; };
30-
36E2C6E022AA5BAE0037499F /* chilkoottrail.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 36E2C6D322AA5BAE0037499F /* chilkoottrail.jpg */; };
31-
36E2C6E122AA5BAE0037499F /* rainbowlake.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 36E2C6D422AA5BAE0037499F /* rainbowlake.jpg */; };
3233
36E2C6E822AA5C530037499F /* LandmarkDetail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36E2C6E722AA5C530037499F /* LandmarkDetail.swift */; };
3334
36E2C6EA22AA5E670037499F /* LandmarkRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36E2C6E922AA5E670037499F /* LandmarkRow.swift */; };
3435
36E2C6EC22AA60300037499F /* LandmarkList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36E2C6EB22AA60300037499F /* LandmarkList.swift */; };
3536
/* End PBXBuildFile section */
3637

3738
/* Begin PBXFileReference section */
39+
36A89B9522AACB3B0096F89A /* UserData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserData.swift; sourceTree = "<group>"; };
40+
36A89B9722AACDE30096F89A /* lakemcdonald.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = lakemcdonald.jpg; sourceTree = "<group>"; };
41+
36A89B9822AACDE30096F89A /* chincoteague.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = chincoteague.jpg; sourceTree = "<group>"; };
42+
36A89B9922AACDE30096F89A /* chilkoottrail.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = chilkoottrail.jpg; sourceTree = "<group>"; };
43+
36A89B9A22AACDE30096F89A /* landmarkData.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = landmarkData.json; sourceTree = "<group>"; };
44+
36A89B9B22AACDE30096F89A /* icybay.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = icybay.jpg; sourceTree = "<group>"; };
45+
36A89B9C22AACDE30096F89A /* turtlerock.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = turtlerock.jpg; sourceTree = "<group>"; };
46+
36A89B9D22AACDE30096F89A /* rainbowlake.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = rainbowlake.jpg; sourceTree = "<group>"; };
47+
36A89B9E22AACDE30096F89A /* charleyrivers.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = charleyrivers.jpg; sourceTree = "<group>"; };
48+
36A89B9F22AACDE30096F89A /* twinlake.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = twinlake.jpg; sourceTree = "<group>"; };
49+
36A89BA022AACDE40096F89A /* stmarylake.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = stmarylake.jpg; sourceTree = "<group>"; };
50+
36A89BA122AACDE40096F89A /* umbagog.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = umbagog.jpg; sourceTree = "<group>"; };
51+
36A89BA222AACDE40096F89A /* silversalmoncreek.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = silversalmoncreek.jpg; sourceTree = "<group>"; };
52+
36A89BA322AACDE40096F89A /* hiddenlake.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = hiddenlake.jpg; sourceTree = "<group>"; };
3853
36C193F322A8F28C00966915 /* SwiftUI-Tutorials.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "SwiftUI-Tutorials.app"; sourceTree = BUILT_PRODUCTS_DIR; };
3954
36C193F622A8F28C00966915 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
4055
36C193F822A8F28C00966915 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = "<group>"; };
@@ -46,19 +61,6 @@
4661
36C1940E22A8F30800966915 /* CircleImage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CircleImage.swift; sourceTree = "<group>"; };
4762
36E2C6C322AA5B990037499F /* Data.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Data.swift; sourceTree = "<group>"; };
4863
36E2C6C422AA5B990037499F /* Landmark.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Landmark.swift; sourceTree = "<group>"; };
49-
36E2C6C822AA5BAE0037499F /* turtlerock.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = turtlerock.jpg; sourceTree = "<group>"; };
50-
36E2C6C922AA5BAE0037499F /* silversalmoncreek.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = silversalmoncreek.jpg; sourceTree = "<group>"; };
51-
36E2C6CA22AA5BAE0037499F /* icybay.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = icybay.jpg; sourceTree = "<group>"; };
52-
36E2C6CB22AA5BAE0037499F /* lakemcdonald.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = lakemcdonald.jpg; sourceTree = "<group>"; };
53-
36E2C6CC22AA5BAE0037499F /* hiddenlake.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = hiddenlake.jpg; sourceTree = "<group>"; };
54-
36E2C6CD22AA5BAE0037499F /* twinlake.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = twinlake.jpg; sourceTree = "<group>"; };
55-
36E2C6CE22AA5BAE0037499F /* umbagog.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = umbagog.jpg; sourceTree = "<group>"; };
56-
36E2C6CF22AA5BAE0037499F /* landmarkData.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = landmarkData.json; sourceTree = "<group>"; };
57-
36E2C6D022AA5BAE0037499F /* chincoteague.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = chincoteague.jpg; sourceTree = "<group>"; };
58-
36E2C6D122AA5BAE0037499F /* yukon_charleyrivers.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = yukon_charleyrivers.jpg; sourceTree = "<group>"; };
59-
36E2C6D222AA5BAE0037499F /* stmarylake.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = stmarylake.jpg; sourceTree = "<group>"; };
60-
36E2C6D322AA5BAE0037499F /* chilkoottrail.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = chilkoottrail.jpg; sourceTree = "<group>"; };
61-
36E2C6D422AA5BAE0037499F /* rainbowlake.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = rainbowlake.jpg; sourceTree = "<group>"; };
6264
36E2C6E722AA5C530037499F /* LandmarkDetail.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LandmarkDetail.swift; sourceTree = "<group>"; };
6365
36E2C6E922AA5E670037499F /* LandmarkRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LandmarkRow.swift; sourceTree = "<group>"; };
6466
36E2C6EB22AA60300037499F /* LandmarkList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LandmarkList.swift; sourceTree = "<group>"; };
@@ -123,26 +125,27 @@
123125
children = (
124126
36E2C6C322AA5B990037499F /* Data.swift */,
125127
36E2C6C422AA5B990037499F /* Landmark.swift */,
128+
36A89B9522AACB3B0096F89A /* UserData.swift */,
126129
);
127130
path = Models;
128131
sourceTree = "<group>";
129132
};
130133
36E2C6C722AA5BAE0037499F /* Resources */ = {
131134
isa = PBXGroup;
132135
children = (
133-
36E2C6D322AA5BAE0037499F /* chilkoottrail.jpg */,
134-
36E2C6D022AA5BAE0037499F /* chincoteague.jpg */,
135-
36E2C6CC22AA5BAE0037499F /* hiddenlake.jpg */,
136-
36E2C6CA22AA5BAE0037499F /* icybay.jpg */,
137-
36E2C6CB22AA5BAE0037499F /* lakemcdonald.jpg */,
138-
36E2C6CF22AA5BAE0037499F /* landmarkData.json */,
139-
36E2C6D422AA5BAE0037499F /* rainbowlake.jpg */,
140-
36E2C6C922AA5BAE0037499F /* silversalmoncreek.jpg */,
141-
36E2C6D222AA5BAE0037499F /* stmarylake.jpg */,
142-
36E2C6C822AA5BAE0037499F /* turtlerock.jpg */,
143-
36E2C6CD22AA5BAE0037499F /* twinlake.jpg */,
144-
36E2C6CE22AA5BAE0037499F /* umbagog.jpg */,
145-
36E2C6D122AA5BAE0037499F /* yukon_charleyrivers.jpg */,
136+
36A89B9E22AACDE30096F89A /* charleyrivers.jpg */,
137+
36A89B9922AACDE30096F89A /* chilkoottrail.jpg */,
138+
36A89B9822AACDE30096F89A /* chincoteague.jpg */,
139+
36A89BA322AACDE40096F89A /* hiddenlake.jpg */,
140+
36A89B9B22AACDE30096F89A /* icybay.jpg */,
141+
36A89B9722AACDE30096F89A /* lakemcdonald.jpg */,
142+
36A89B9A22AACDE30096F89A /* landmarkData.json */,
143+
36A89B9D22AACDE30096F89A /* rainbowlake.jpg */,
144+
36A89BA222AACDE40096F89A /* silversalmoncreek.jpg */,
145+
36A89BA022AACDE40096F89A /* stmarylake.jpg */,
146+
36A89B9C22AACDE30096F89A /* turtlerock.jpg */,
147+
36A89B9F22AACDE30096F89A /* twinlake.jpg */,
148+
36A89BA122AACDE40096F89A /* umbagog.jpg */,
146149
);
147150
path = Resources;
148151
sourceTree = "<group>";
@@ -214,22 +217,22 @@
214217
isa = PBXResourcesBuildPhase;
215218
buildActionMask = 2147483647;
216219
files = (
217-
36E2C6D822AA5BAE0037499F /* lakemcdonald.jpg in Resources */,
218-
36E2C6D622AA5BAE0037499F /* silversalmoncreek.jpg in Resources */,
219-
36E2C6DC22AA5BAE0037499F /* landmarkData.json in Resources */,
220-
36E2C6D522AA5BAE0037499F /* turtlerock.jpg in Resources */,
220+
36A89BAF22AACDE40096F89A /* silversalmoncreek.jpg in Resources */,
221221
36C1940322A8F29100966915 /* LaunchScreen.storyboard in Resources */,
222-
36E2C6DB22AA5BAE0037499F /* umbagog.jpg in Resources */,
223-
36E2C6DF22AA5BAE0037499F /* stmarylake.jpg in Resources */,
224-
36E2C6DD22AA5BAE0037499F /* chincoteague.jpg in Resources */,
222+
36A89BAA22AACDE40096F89A /* rainbowlake.jpg in Resources */,
223+
36A89BAE22AACDE40096F89A /* umbagog.jpg in Resources */,
224+
36A89BA622AACDE40096F89A /* chilkoottrail.jpg in Resources */,
225+
36A89BAD22AACDE40096F89A /* stmarylake.jpg in Resources */,
226+
36A89BB022AACDE40096F89A /* hiddenlake.jpg in Resources */,
227+
36A89BA922AACDE40096F89A /* turtlerock.jpg in Resources */,
228+
36A89BA822AACDE40096F89A /* icybay.jpg in Resources */,
229+
36A89BA722AACDE40096F89A /* landmarkData.json in Resources */,
230+
36A89BAC22AACDE40096F89A /* twinlake.jpg in Resources */,
225231
36C1940022A8F29100966915 /* Preview Assets.xcassets in Resources */,
226-
36E2C6D722AA5BAE0037499F /* icybay.jpg in Resources */,
227-
36E2C6DA22AA5BAE0037499F /* twinlake.jpg in Resources */,
228-
36E2C6D922AA5BAE0037499F /* hiddenlake.jpg in Resources */,
232+
36A89BAB22AACDE40096F89A /* charleyrivers.jpg in Resources */,
233+
36A89BA422AACDE40096F89A /* lakemcdonald.jpg in Resources */,
229234
36C193FD22A8F29100966915 /* Assets.xcassets in Resources */,
230-
36E2C6E122AA5BAE0037499F /* rainbowlake.jpg in Resources */,
231-
36E2C6E022AA5BAE0037499F /* chilkoottrail.jpg in Resources */,
232-
36E2C6DE22AA5BAE0037499F /* yukon_charleyrivers.jpg in Resources */,
235+
36A89BA522AACDE40096F89A /* chincoteague.jpg in Resources */,
233236
);
234237
runOnlyForDeploymentPostprocessing = 0;
235238
};
@@ -248,6 +251,7 @@
248251
36C193F922A8F28C00966915 /* SceneDelegate.swift in Sources */,
249252
36E2C6E822AA5C530037499F /* LandmarkDetail.swift in Sources */,
250253
36E2C6EA22AA5E670037499F /* LandmarkRow.swift in Sources */,
254+
36A89B9622AACB3B0096F89A /* UserData.swift in Sources */,
251255
36C1941122A8F30800966915 /* CircleImage.swift in Sources */,
252256
);
253257
runOnlyForDeploymentPostprocessing = 0;

SwiftUI-Tutorials/LandmarkDetail.swift

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,41 +9,65 @@
99
import SwiftUI
1010

1111
struct LandmarkDetail: View {
12+
@EnvironmentObject var userData: UserData
1213
var landmark: Landmark
1314

15+
var landmarkIndex: Int {
16+
userData.landmarks.firstIndex(where: { $0.id == landmark.id })!
17+
}
18+
1419
var body: some View {
1520
VStack {
1621
MapView(coordinate: landmark.locationCoordinate)
22+
.edgesIgnoringSafeArea(.top)
1723
.frame(height: 300)
1824

1925
CircleImage(image: landmark.image(forSize: 250))
20-
.offset(y: -130)
26+
.offset(x: 0, y: -130)
2127
.padding(.bottom, -130)
2228

2329
VStack(alignment: .leading) {
24-
Text(landmark.name)
25-
.font(.title)
30+
HStack {
31+
Text(verbatim: landmark.name)
32+
.font(.title)
33+
34+
Button(action: {
35+
self.userData.landmarks[self.landmarkIndex]
36+
.isFavorite.toggle()
37+
}) {
38+
if self.userData.landmarks[self.landmarkIndex]
39+
.isFavorite {
40+
Image(systemName: "star.fill")
41+
.foregroundColor(Color.yellow)
42+
} else {
43+
Image(systemName: "star")
44+
.foregroundColor(Color.gray)
45+
}
46+
}
47+
}
2648

2749
HStack(alignment: .top) {
28-
Text(landmark.park)
50+
Text(verbatim: landmark.park)
2951
.font(.subheadline)
3052
Spacer()
31-
Text(landmark.state)
53+
Text(verbatim: landmark.state)
3254
.font(.subheadline)
3355
}
3456
}
3557
.padding()
3658

3759
Spacer()
3860
}
39-
.navigationBarTitle(Text(landmark.name), displayMode: .inline)
4061
}
4162
}
4263

4364
#if DEBUG
44-
struct LandmarkDetail_Previews : PreviewProvider {
65+
struct LandmarkDetail_Preview: PreviewProvider {
4566
static var previews: some View {
46-
LandmarkDetail(landmark: landmarkData[0])
67+
let userData = UserData()
68+
return LandmarkDetail(landmark: userData.landmarks[0])
69+
.environmentObject(userData)
4770
}
4871
}
4972
#endif
73+

SwiftUI-Tutorials/LandmarkList.swift

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,27 +8,39 @@
88

99
import SwiftUI
1010

11-
struct LandmarkList : View {
11+
struct LandmarkList: View {
12+
@EnvironmentObject private var userData: UserData
13+
1214
var body: some View {
1315
NavigationView {
14-
List(landmarkData) { landmark in
15-
NavigationButton(destination: LandmarkDetail(landmark: landmark)) {
16-
LandmarkRow(landmark: landmark)
16+
List {
17+
Toggle(isOn: $userData.showFavoritesOnly) {
18+
Text("Show Favorites Only")
1719
}
20+
21+
ForEach(userData.landmarks) { landmark in
22+
if !self.userData.showFavoritesOnly || landmark.isFavorite {
23+
NavigationButton(
24+
destination: LandmarkDetail(landmark: landmark)) {
25+
LandmarkRow(landmark: landmark)
26+
}
27+
}
1828
}
19-
.navigationBarTitle(Text("Landmarks"))
29+
}
30+
.navigationBarTitle(Text("Landmarks"), displayMode: .large)
2031
}
2132
}
2233
}
2334

2435
#if DEBUG
25-
struct LandmarkList_Previews : PreviewProvider {
36+
struct LandmarksList_Previews: PreviewProvider {
2637
static var previews: some View {
2738
ForEach(["iPhone SE", "iPhone XS Max"].identified(by: \.self)) { deviceName in
2839
LandmarkList()
2940
.previewDevice(PreviewDevice(rawValue: deviceName))
3041
.previewDisplayName(deviceName)
31-
}
42+
}
43+
.environmentObject(UserData())
3244
}
3345
}
3446
#endif

0 commit comments

Comments
 (0)