★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/11075287.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
在标记应用程序中,用户可以标记他们喜欢的地方,并过滤列表以显示他们的最爱。要创建此功能,您首先要在列表中添加一个开关,以便用户只关注他们的收藏夹,然后您将添加一个星形按钮,用户点击该按钮以标记为收藏夹。
下载入门项目并按照本教程进行操作,或打开已完成的项目并自行探索代码。
一、标记用户最喜欢的地标
首先,通过增强列表,一目了然地向用户展示他们的最爱。为每个显示最喜欢的地标的人添加一颗星。LandmarkRow
第1步
打开起始点Xcode项目,然后在Project导航器中选择。LandmarkRow.swift
第2步
在间隔符之后,在if
语句中添加星形图像以测试当前地标是否是最喜欢的。
1 import SwiftUI 2 3 struct LandmarkRow: View { 4 var landmark: Landmark 5 6 var body: some View { 7 HStack { 8 landmark.image(forSize: 50) 9 Text(landmark.name) 10 Spacer() 11 12 if landmark.isFavorite { 13 Image(systemName: "star.fill") 14 .imageScale(.medium) 15 } 16 } 17 } 18 } 19 20 struct LandmarkRow_Previews: PreviewProvider { 21 static var previews: some View { 22 Group { 23 LandmarkRow(landmark: landmarkData[0]) 24 LandmarkRow(landmark: landmarkData[1]) 25 } 26 .previewLayout(.fixed( 300, height: 70)) 27 } 28 }
第3步
由于系统图像是基于矢量的,因此您可以使用修改器更改其颜色。foregroundColor(_:)
二、过滤列表视图
您可以自定义列表视图,以便显示所有地标,或仅显示用户的收藏夹。为此,您需要在该类型中添加一些状态。LandmarkList
状态是一个值或一组值,它们可以随时间变化,并且会影响视图的行为,内容或布局。您使用具有该@State
属性的属性将状态添加到视图。
第1步
在项目导航器中选择。添加一个名为to 的属性,其初始值设置为:
LandmarkList.swift
@State
showFavoritesOnly
LandmarkList
false
1 import SwiftUI 2 3 struct LandmarkList: View { 4 @State var showFavoritesOnly = false 5 6 var body: some View { 7 NavigationView { 8 List(landmarkData) { landmark in 9 NavigationButton(destination: LandmarkDetail(landmark: landmark)) { 10 LandmarkRow(landmark: landmark) 11 } 12 } 13 .navigationBarTitle(Text("Landmarks")) 14 } 15 } 16 } 17 18 struct LandmarkList_Previews: PreviewProvider { 19 static var previews: some View { 20 LandmarkList() 21 } 22 }
第2步
单击“ 继续”按钮刷新画布。
三、添加控件以切换状态
要让用户控制列表的过滤器,您需要添加一个可以改变其值的控件。您可以通过将绑定传递给切换控件来完成此操作。showFavoritesOnly
结合充当到可变状态的参考。当用户将切换从关闭切换为打开然后再关闭时,控件使用绑定相应地更新视图的状态。
创建嵌套组以将标记转换为行。ForEach
四、使用可绑定对象进行存储
要准备用户控制哪些特定地标是收藏夹,您首先将地标数据存储在可绑定对象中。
可绑定对象是数据的自定义对象,可以从SwiftUI环境中的存储绑定到视图。SwiftUI监视可能影响视图的可绑定对象的任何更改,并在更改后显示正确的视图版本。
第1步
创建一个名为的新Swift文件并声明一个模型类型。UserData.swift
1 import SwiftUI 2 3 final class UserData: BindableObject { 4 5 }
第2步
使用作为发布者添加所需的属性。didChange
PassthroughSubject
五、在视图中采用模型对象
UserData
第1步
在用属性替换声明,并向预览添加修改器。
LandmarkList.swift
showFavoritesOnly
@EnvironmentObject
environmentObject(_:)
六、为每个地标创建收藏按钮
第1步
将地标的名称嵌入到。LandmarkDetail.swift
HStack
1 import SwiftUI 2 3 struct LandmarkDetail: View { 4 @EnvironmentObject var userData: UserData 5 var landmark: Landmark 6 7 var landmarkIndex: Int { 8 userData.landmarks.firstIndex(where: { $0.id == landmark.id })! 9 } 10 11 var body: some View { 12 VStack { 13 MapView(landmark: landmark) 14 .frame(height: 300) 15 16 CircleImage(image: landmark.image(forSize: 250)) 17 .offset(y: -130) 18 .padding(.bottom, -130) 19 20 VStack(alignment: .leading) { 21 HStack { 22 Text(landmark.name) 23 .font(.title) 24 } 25 26 HStack(alignment: .top) { 27 Text(landmark.park) 28 .font(caption) 29 Spacer() 30 Text(landmark.state) 31 .font(.caption) 32 } 33 } 34 .padding() 35 36 Spacer() 37 } 38 .navigationBarTitle(Text(landmark.name), displayMode: .inline) 39 } 40 } 41 42 struct LandmarkDetail_Preview: PreviewProvider { 43 static var previews: some View { 44 LandmarkDetail(landmark: landmarkData[0]) 45 .environmentObject(UserData()) 46 } 47 }
第2步
在地标名称旁边创建一个新按钮。使用if
- else
条件语句提供不同的图像,指示地标是否是最喜欢的。