【问题标题】:SwiftUi ViewModel Not initializing all stored propertiesSwiftUi ViewModel 未初始化所有存储的属性
【发布时间】:2020-08-29 05:55:51
【问题描述】:

我正在尝试将数据传递到 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?

标签: swiftui


【解决方案1】:

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

class ShowViewModel:  ObservableObject {
  
    @Published var entry: Entry

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

}

【讨论】:

  • 在这个初始化之后我什么都做不了。
  • 什么意思?在您甚至无法编译之前。很可能您需要添加@Published(当您声明类 ObservableObject)
【解决方案2】:

这是工作代码。

我猜你忘记在 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()
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    • 2020-07-09
    • 2021-06-11
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多