UserDefaults 用于存储数组中的按钮选择

时间:2021-01-01 21:05:27

标签: ios swift firebase swiftui userdefaults

正在努力弄清楚如何在此处存储按钮的选择,并希望有人能提供帮助。我首先进行数据库查询以返回结果列表,每个项目都有一个按钮,单击该按钮时,它将始终显示他们单击了它。它当前的工作方式,当我在页面上时,我可以单击添加,它可以工作并写入数据库,当单击它时,它会更改为“撤消”按钮,这也以我想要的方式工作,但是一旦我离开这个视图并回来,它就会通过“添加”按钮恢复到原来的状态。如果用户按下“添加”,我希望它保持不变,并在用户返回此屏幕时始终显示“撤消”按钮。任何帮助都会很棒,因为我对此很陌生。

代码如下:

主视图

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
}

1 个答案:

答案 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
相关问题