【发布时间】:2021-02-21 20:22:33
【问题描述】:
关键是在成功将记录添加到数据库后(当我点击确认按钮时),应该关闭视图。问题是添加后没有关闭,.onReceive没有触发,虽然发布者PassthroughSubject发送了一个新值。有一件事:如果在单击确认按钮之前触发了警报,则视图将关闭(例如,当未填写所有字段时,将显示警告)
此外,属性viewModel.name 和viewModel.name(对于TextField's)在添加记录后变为等于空字符串,尽管我没有在代码中的任何地方明确地为它们分配这样的值(就像一个新的视图模型的实例是在这些默认值所在的位置创建的)
查看:
struct AddChallengeView: View {
@Environment(\.presentationMode) var presentationMode
@ObservedObject var viewModel = AddChallengeViewModel()
var body: some View {
Form{
Section(header: Text("Name")){
TextField("Type challenge name", text: $viewModel.name) //viewModel.name == "" after new record added
}
Section(header: Text("Description")){
TextEditor(text: $viewModel.description) //viewModel.description == "" after new record added
}
//...
Section{
Button(action: { viewModel.addChallenge()}){
HStack{
Spacer()
Text("Submit").bold()
Spacer()
}
}
}
}.alert(isPresented: $viewModel.showErrorAlert){
Alert(title: Text("Please, set all values!"))
}
.onReceive(viewModel.viewDismissalModePublisher) { shouldDismiss in
print("new value received") //not printed
if shouldDismiss {
self.presentationMode.wrappedValue.dismiss()
}
}
}
}
视图模型:
class AddChallengeViewModel: ObservableObject{
var viewDismissalModePublisher = PassthroughSubject<Bool, Never>()
private var shouldDismissView = false {
print("sending new value") //printed
didSet {
viewDismissalModePublisher.send(shouldDismissView)
}
}
@Published var showErrorAlert = false
@Published var name = ""
@Published var description = ""
//...
func addChallenge () {
//...
if (name != "" && description != "" && grounds.count != 0){
Firestore.firestore().collection("users").document(Auth.auth().currentUser!.uid).collection("challenges").addDocument(data: [
"name": "\(name)",
"description": "\(description)",
"grounds": grounds
]) { err in
if let err = err {
print("Error adding document: \(err)")
} else {
print("setting new value") //printed
self.shouldDismissView = true
}
}
} else {
showErrorAlert.toggle()
}
}
}
更新:我找到了解决方案。我们需要将AddChallengeView 中的@StateObject var viewModel = AddChallengeViewModel() 替换为@ObservedObject var viewModel = AddChallengeViewModel(),但为什么它会起作用?
【问题讨论】: