外观风格
给每个 Landmark 创建收藏按钮
Landmarks app 现在可以在显示全部地标或收藏的地标之间切换,但收藏的地标仍是硬编码的。为了让用户可以手动添加和删除收藏,我们需要在地标详情视图中添加收藏夹按钮。

你首先要创建一个可复用的 FavoriteButton
。
第 1 步
在 Views
目录创建一个名为 FavoriteButton.swift
的新视图。
第 2 步
添加一个 isSet
绑定,表明按钮的当前状态,并为预览提供一个常量值。
因为使用了
@Binding
,所以在这个视图中的变化会传播到数据源中。
第 3 步
创建一个带有切换 isSet
状态的 Button
,isSet
改变时,Button
会的外观会有相应的变化。
当使用
iconOnly
标签样式时,为按钮的label
提供的标题不会出现在 UI 中,但VoiceOver
会使用它来提高可访问性。
注意
如果使用 .iconOnly
时出现错误:Cannot infer contextual base in reference to member 'iconOnly'
,请改用 IconOnlyLabelStyle()
修饰符。
随着项目文件的增多,我们需要整理一下文件,进行分组管理。
第 4 步
将通用的 CircleImage.swift
、MapView.swift
和 FavoriteButton.swift
放到 Views
下新建的 Helpers
目录,将地标相关的视图放到 Views
下新建的 Landmarks
目录中。

接下来,要将 FavoriteButton
添加到详情视图中,把按钮的 isSet
属性与给定地标的 isFavorite
属性绑定。
第 5 步
切换到 LandmarkDetail.swift
,通过与 modelData
的比较来计算输入地标的索引。
为了实现这个功能,还需要访问 modelData
。
第 6 步
在 HStack
中嵌入地标的名称,并新建 FavoriteButton
;用符号($)
为 isFavorite
属性提供一个绑定。
在 modelData
对象中使用 landmarkIndex
,点击该按钮时就能更新 modelData
中的对应地标的 isFavorite
属性。
第 7 步
打开 LandmarkList.swift
文件,并打开实时预览。
当从列表中的某一项导航到详情并点击收藏按钮后,返回到列表查看,该项会显示一个星形图形,表明该项已经被收藏。
这是因为两个视图都访问了环境中的同一个 modelData
,数据在两个视图中同步。

课后问答
检验一下你是否真的学会了