Skip to content

将数据传入子视图

LandmarkDetail 现在依然使用硬编码的数据来显示地标。像 LandmarkRow 一样,LandmarkDetail 类型和它组合的其他视图都需要一个 landmark 属性作为它们的数据源。

在开始子视图的内容时,我们会把 CircleImageMapViewLandmarkDetail 的显示从硬编码改为传入的数据。

第 1 步

CircleImage.swift 中,为 CircleImage 添加一个存储图像的属性:Image

这是使用 SwiftUI 构建视图时的一个常见模式。自定义视图往往会包裹和封装一系列特定视图的修饰符。

第 2 步

更新 CircleImage.swiftPreviewProvider,以传递 turtlerock 的图像。

即便已经修复了预览逻辑,预览还是不能显示,因为构建失败了。LandmarkDetail.swift 调用 CircleImage 进行实例化的时候,还需要一个图像参数

第 3 步

MapView.swift 中,为 MapView 添加一个 coordinate 属性,并更新 PreviewProvider 以传递一个固定坐标。

这个变化也会影响构建,和上一步的一样,这时 LandmarkDetail 视图调用 MapView 需要新的参数。后面我们会修复详情视图的构建。

第 4 步

添加一个 setRegion 方法,参数为 coordinate, 我们要根据坐标值来更新区域。

第 5 步

MapView 添加一个 onAppear 修饰符,调用 setRegion 方法,用于根据当前坐标来进行区域计算。

第 6 步

LandmarkDetail.swift 中,为 LandmarkDetail 类型添加一个 landmark 属性。

第 7 步

LandmarkList.swift 中,将当前的 landmark 传递给 LandmarkDetail

第 8 步

LandmarkDetail.swift 文件中,将 landmark 传递给其他所需的自定义类型。

至此,预览功能又恢复了。

第 9 步

LandmarkDetail.swift 的容器从 VStack 改为 ScrollView,这样用户就可以滚动浏览内容,然后接着删除不再需要的 Spacer

第 10 步

最后,调用 navigationTitle(_:) 修饰符,在显示详情视图时给导航栏添加标题,并调用navigationBarTitleDisplayMode(_:) 修饰符,使标题的显示模式为 inline

只有当视图是导航 stack 的一部分时,导航变化才会产生影响。

第 11 步

切换到实时预览,当从列表中某个列表项跳转到详情时,可以看到详情视图显示正确的地标。

将数据传入子视图 has loaded