外观风格
将数据传入子视图
LandmarkDetail
现在依然使用硬编码的数据来显示地标。像 LandmarkRow
一样,LandmarkDetail
类型和它组合的其他视图都需要一个 landmark
属性作为它们的数据源。
在开始子视图的内容时,我们会把 CircleImage
、 MapView
和 LandmarkDetail
的显示从硬编码改为传入的数据。

第 1 步
在 CircleImage.swift
中,为 CircleImage
添加一个存储图像的属性:Image
。
这是使用 SwiftUI 构建视图时的一个常见模式。自定义视图往往会包裹和封装一系列特定视图的修饰符。
第 2 步
更新 CircleImage.swift
的 PreviewProvider
,以传递 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 步
切换到实时预览,当从列表中某个列表项跳转到详情时,可以看到详情视图显示正确的地标。
