微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SwiftUi ViewModel不初始化所有存储的属性

如何解决SwiftUi ViewModel不初始化所有存储的属性

我试图将数据传递到viewmodel中,并得到“从初始化返回而不初始化所有存储的属性

viewmodel中的init(entry:Entry)之后,我所做的任何事情都会得到错误

我首先是这样从MainView传递数据的:

struct MainView: View {

    @State var entry = Entry()

    // inputting the data
    TextField("Beg Value",text: self.$entry.a)

    // passing to next view
    NavigationLink(
         destination: ShowView( entry: entry ),label: {Image(systemName: "arrow.clockwise") }) 

}

这是获取数据的视图。

struct ShowView: View {
  
    var entry: Entry
 
    @Observedobject var showVM: Showviewmodel

    init( entry:Entry  ) {
        self.entry = entry
        self.showVM = Showviewmodel( entry: entry  )
    }
}

还有初始化数据后出现错误viewmodel。我尝试了很多变体。

class Showviewmodel:  ObservableObject {
  
    var entry: Entry

    init(entry: Entry) {
        self.entry = entry
    }

   init(){
        print("here") \\ Return from initializer without initializing all stored properties
   }

}

和入口结构。我也上过课。

struct Entry  {

    var month: Date = Date()
    var a:String = "1"
    var b:String = "2"
    var c:String = "3"
    var d:String = "4"
    var e:String = "5"
    var f: String = ""
}

谢谢。

解决方法

删除第二个init并设置一个默认值(如果未在参数中提供,则使用默认值),例如

class ShowViewModel:  ObservableObject {
  
    @Published var entry: Entry

    init(entry: Entry = Entry()) {
        self.entry = entry
    }

}
,

这是工作代码。

我想您忘了在MainView中添加NavigationView了,而Body丢失了。

此外,可以使用@Binding代替@ObservedObject。

struct Entry  {
    var month: Date = Date()
    var a:String = "1"
    var b:String = "2"
    var c:String = "3"
    var d:String = "4"
    var e:String = "5"
    var f: String = ""
}

class ShowViewModel:  ObservableObject {
  
    var entry: Entry

    init(entry: Entry) {
        self.entry = entry
    }

}

struct ShowView: View {
  
    @ObservedObject var showVM: ShowViewModel

    init( entry:Entry  ) {
        self.showVM = ShowViewModel( entry: entry  )
    }
    
    var body: some View {
        Text(showVM.entry.a)
    }
}

struct MainView: View {

    @State var entry = Entry()
    
    var body: some View{
        NavigationView{
            VStack {
                // inputting the data
                TextField("Beg Value",text: self.$entry.a)
                    .textFieldStyle(RoundedBorderTextFieldStyle())

                // passing to next view
                NavigationLink(
                     destination: ShowView( entry: entry ),label: {Image(systemName: "arrow.clockwise") })
            }.padding()
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。