【发布时间】:2021-01-10 19:08:12
【问题描述】:
我正在构建一个类似于 Apple 的 Fruta SwiftUI 示例应用中的“收藏夹”功能的功能。该应用程序的用户可以查看冰沙列表并将任何冰沙标记为“最喜欢的”。收藏夹列表存储在单独的屏幕上并可供查看。
下面的示例视图做了两个重要的事情:
- 它会检查冰沙是否已经在
isFavorite的收藏夹列表中,以便可以通过按钮图像反映这一点。 - 它使用
toggleFavorite在收藏夹列表中添加/删除冰沙。
型号:
struct Smoothie: Identifiable, Codable {
var id: String
var title: String
var description: String
var hasFreeRecipe = false
}
class FrutaModel: ObservableObject {
@Published private(set) var favoriteSmoothieIDs = Set<Smoothie.ID>()
func toggleFavorite(smoothie: Smoothie) {
if favoriteSmoothieIDs.contains(smoothie.id) {
favoriteSmoothieIDs.remove(smoothie.id)
} else {
favoriteSmoothieIDs.insert(smoothie.id)
}
}
func isFavorite(smoothie: Smoothie) -> Bool {
favoriteSmoothieIDs.contains(smoothie.id)
}
}
用于(取消)收藏冰沙的按钮视图:
struct SmoothieFavoriteButton: View {
@EnvironmentObject private var model: FrutaModel
var smoothie: Smoothie?
var isFavorite: Bool {
guard let smoothie = smoothie else { return false }
return model.favoriteSmoothieIDs.contains(smoothie.id)
}
var body: some View {
Button(action: toggleFavorite) {
Label("Favorite", systemImage: isFavorite ? "heart.fill" : "heart")
}
}
func toggleFavorite() {
guard let smoothie = smoothie else { return }
model.toggleFavorite(smoothie: smoothie)
}
}
我的问题:如何在使用 Toggle 而不是 Button 时获得类似的结果? Toggle 需要绑定作为属性,但由于特定冰沙的 isFavorite 值来自包含完整收藏夹列表的 Set (favoriteSmoothieIDs),因此我不能简单地为 Toggle 提供绑定。
【问题讨论】:
-
如果此代码包含您所指的列表,我相信有人已经为您回答了这个问题。 (model.favoriteSmoothieIDs 为空)。请提供足够的代码来证明您的问题。这包括为 Smoothie 添加一个定义和一个显示列表的视图。
-
我刚刚添加了定义
Smoothie的结构,如果这就是你的意思。我认为 model.favoriteSmoothieIDs 中存储的实际值并不重要。 favoriteSmoothieID 列表可以为空,这也是用户尚未将任何冰沙标记为收藏的默认状态。 -
是的。我明白。我从原始教程中获取了冰沙的定义,并在发表我的第一条评论之前运行了你的代码。按原样运行代码实际上并没有做任何事情。另外:您添加了未定义的 MeasuredIngredient,因此再次有人很难帮助您,因为您没有提供有意义的工作示例。