大佬教程收集整理的这篇文章主要介绍了已发布值更改后不会触发 onReceive,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
关键是在成功向数据库添加记录后(当我点击确认按钮时),视图应该关闭。问题是添加后没有关闭,test()
没有触发,尽管发布者.onReceive
发送了一个新值。有一件事:如果在单击确认按钮之前触发了警报,则视图将关闭(例如,当未填写所有字段时,会显示警告)
还有属性 PassthroughSubject
和 viewmodel.name
(对于 viewmodel.name
的)在添加记录后变得等于空字符串,尽管我没有在代码(就像在这些默认值所在的地方创建了视图模型的新实例一样)
查看:
TextFIEld
视图模型:
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()
}
}
}
中的 @Observedobject var viewmodel = AddChALLENgeviewmodel()
替换为 @StateObject var viewmodel = AddChALLENgeviewmodel()
,但为什么它会起作用?
但为什么它有效?
很可能您在 AddChALLENgeView
(或在工作流程中重新创建内容的另一个容器)中使用 NavigationView
,因此具有
@ObservedObject var viewModel = AddChALLENgeViewModel()
在每次重新创建此类视图时创建 AddChALLENgeViewModel
类的新实例,因此之前的任何更改都将丢失。不过
@StateObject var viewModel = AddChALLENgeViewModel()
保留模型的实例(第一次创建)并将其注入到在视图层次结构的相同位置重新创建的相同类型的新视图中。此外,新视图会收到有关同一模型的所有更改的通知。
实际上,@StateObject
属性包装器为 ObservabLeobject
提供的行为与 @State
为值类型提供的行为相同。
以上是大佬教程为你收集整理的已发布值更改后不会触发 onReceive全部内容,希望文章能够帮你解决已发布值更改后不会触发 onReceive所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。