★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝()➤GitHub地址:➤原文地址: ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★在标记应用程序中,用户可以标记他们喜欢的地方,并过滤列表以显示他们的最爱。要创建此功能,您首先要在列表中添加一个开关,以便用户只关注他们的收藏夹,然后您将添加一个星形按钮,用户点击该按钮以标记为收藏夹。
下载入门项目并按照本教程进行操作,或打开已完成的项目并自行探索代码。
一、标记用户最喜欢的地标
首先,通过增强列表,一目了然地向用户展示他们的最爱。为每个显示最喜欢的地标的人添加一颗星。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(width: 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 SwiftUI2 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
条件语句提供不同的图像,指示地标是否是最喜欢的。