Skip to content

给每个 Landmark 创建收藏按钮

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

你首先要创建一个可复用的 FavoriteButton

第 1 步

Views 目录创建一个名为 FavoriteButton.swift 的新视图。

第 2 步

添加一个 isSet 绑定,表明按钮的当前状态,并为预览提供一个常量值。

因为使用了 @Binding,所以在这个视图中的变化会传播到数据源中。

第 3 步

创建一个带有切换 isSet 状态的 ButtonisSet改变时,Button 会的外观会有相应的变化。

当使用 iconOnly 标签样式时,为按钮的 label 提供的标题不会出现在 UI 中,但 VoiceOver 会使用它来提高可访问性。

注意

如果使用 .iconOnly 时出现错误:Cannot infer contextual base in reference to member 'iconOnly',请改用 IconOnlyLabelStyle() 修饰符。

随着项目文件的增多,我们需要整理一下文件,进行分组管理。

第 4 步

将通用的 CircleImage.swiftMapView.swiftFavoriteButton.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,数据在两个视图中同步。

课后问答

检验一下你是否真的学会了
给每个 Landmark 创建收藏按钮 has loaded