【发布时间】:2021-09-10 09:57:01
【问题描述】:
在我的应用程序中,我试图阻止用户点赞帖子两次。我当前的代码是:
@State private var isLiked = false
HStack {
Button(action: {if isLiked == false{
postData.addLike(id: post.id)
isLiked = true
} else{
postData.unLike(id: post.id)
isLiked = false
}}, label: {
Image(systemName: isLiked ? "heart.fill" : "heart")
.resizable()
.aspectRatio(contentMode: .fill)
.frame(width: 20)
.foregroundColor(isLiked ? .red : .gray)
目前,当第一次按下like按钮时,它会变成红色并执行“addLike”。但是,如果我关闭应用程序并重新打开它,按钮不再是红色的。无论应用程序关闭/重新打开多少次,我都希望按钮保持红色,直到用户按下它以不同于它。
我已经阅读了有关使用 UserDefaults 的信息,但这些在卸载应用程序时会被清除。我有我的应用程序链接到 Google Firebase,所以我想当应用程序被喜欢时,将用户 ID 添加到名为“likedBy”的列中?然后,当应用程序打开时,让应用程序扫描用户 ID 以查看该帖子是否已被他们喜欢。我不知道如何实现这一点。
对不起,如果这是一个愚蠢的问题,我制作这个应用程序是为了好玩和学习。
编辑 由于我在下面标记的答案,我已经能够部分解决这个问题。我在后端(postData)中设置了一个数组:
self.ref.collection("Posts").document(id).updateData([
"likedBy": FieldValue.arrayUnion([self.uid])
self.ref.collection("Posts").document(id).updateData([
"likedBy": FieldValue.arrayRemove([self.uid])
此代码将用户的 UID 设置到 likeBy 数组中。现在,我需要弄清楚如何读取这些数据,然后查看用户的 UID 是否等于在数组中找到的 UID。
我的新问题: SwiftUI Firebase - Reading Array Data to see if string is equal to an array string
【问题讨论】:
-
您使用的是 Firestore 还是实时数据库?每个人都没有真正的“列”,但听起来你在用户喜欢某个项目时存储用户 ID 是正确的。然后,您必须在应用程序/视图启动时读取该数据,并在用户“喜欢”或“不喜欢”该项目时更新它。
-
不特定于 SwiftUI 部分,但这些是否回答了您关于在 Firestore 中实现“喜欢”功能的问题? stackoverflow.com/questions/60441035/… 或 stackoverflow.com/questions/48300034/…
-
我正在使用 Firestore。不知道为什么我说“列”。
标签: ios swift xcode firebase swiftui