Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SwiftUi ViewModel未初始化所有存储的属性_Swiftui - Fatal编程技术网

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

SwiftUi ViewModel未初始化所有存储的属性,swiftui,Swiftui,我试图将数据传递到ViewModel,并得到“从初始值设定项返回,而不初始化所有存储的属性” 在ViewModel中init(entry:entry)之后执行的任何操作都会出错 我首先从MainView传入数据,如下所示: struct MainView: View { @State var entry = Entry() // inputting the data TextField("Beg Value", text: self.$entry.

我试图将数据传递到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 = ""
}

谢谢。

删除second
init
并使用默认值创建一个(如果参数中未提供,则使用),如


这是工作代码

我猜你忘了在主视图中添加NavigationView,所以主体不见了

此外,您可以使用@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()
        }
    }
}

在这之后我什么都做不了。你什么意思?在你无法编译之前。很可能您需要添加
@Published
(正如您声明的类observeObject)如果不使用第二个init,为什么需要第二个init?
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()
        }
    }
}