正在努力弄清楚如何在此处存储按钮的选择,并希望有人能提供帮助。我首先进行数据库查询以返回结果列表,每个项目都有一个按钮,单击该按钮时,它将始终显示他们单击了它。它当前的工作方式,当我在页面上时,我可以单击添加,它可以工作并写入数据库,当单击它时,它会更改为“撤消”按钮,这也以我想要的方式工作,但是一旦我离开这个视图并回来,它就会通过“添加”按钮恢复到原来的状态。如果用户按下“添加”,我希望它保持不变,并在用户返回此屏幕时始终显示“撤消”按钮。任何帮助都会很棒,因为我对此很陌生。
代码如下:
主视图
struct AdditemView: View {
let movie: Movie
@State var movieitems = [MovieitemsModel]()
@State var movieID = ""
@State var selection = ""
var body: some View {
VStack {
ForEach(movieitems.indices, id: \.self) { i in
HStack {
Text(movieitems[i].name)
Spacer()
if movieitems[i].selected == false {
Button(action: {
self.selection = movieitems[i].name
self.movieitems[i].selected = true
self.yesitem()
}) {
Text("Add")
}
} else {
HStack {
Text("Added!")
Button(action: {
self.selection = movieitems[i].name
self.movieitems[i].selected = false
self.undoitem()
}) {
Text("Undo")
}
}
}
}
Divider()
}
}
.onAppear {
self.movieID = "\(movie.id)"
fetchitems()
}
}
}
func fetchitems() {
let db = Firestore.firestore()
db.collection("movies").document("\(self.movieID)").collection("items").getDocuments { NewQuerySnapshot, error in
guard let documents = NewQuerySnapshot?.documents else {
print("No Documents")
return
}
movieitems = documents.map { (NewQueryDocumentSnapshot) -> MovieitemsModel in
let data = NewQueryDocumentSnapshot.data()
let name = data["name"] as? String ?? ""
let yes = data["yes"] as? Int?
let no = data["no"] as? Int?
return MovieitemsModel(name: name, yes: yes! ?? 0, no: no! ?? 0)
}
}
}
func yesitem() {
let db = Firestore.firestore()
db.collection("movies").document(movieID).collection("items").document("\(self.selection)").updateData([AnyHashable("yes"): FieldValue.increment(Int64(1))])
}
func undoitem() {
let db = Firestore.firestore()
db.collection("movies").document(movieID).collection("items").document("\(self.selection)").updateData([AnyHashable("yes"): FieldValue.increment(Int64(-1))])
}
物品模型
struct MovieitemsModel: Identifiable {
var id: String = UUID().uuidString
var name: String
var yes: Int
var no: Int
var selected:Bool = false
}
答案 0 :(得分:1)
这样做的一种方法是编写另一个函数,将电影数据保存回数据库并在每个按钮的动作处理程序中调用它。
// Example button
Button(action: {
self.selection = movieitems[i].name
self.movieitems[i].selected = true
self.undoitem()
self.saveItems()
}) {
Text("Undo")
}
// The save method
func saveItems():
// Your Firebase saving code here