我想知道当前(在询问时,第一个Xcode 12.0Beta)是否有一种使用来自初始化器的参数初始化@StateObject的方法。
更确切地说,这段代码可以正常工作:
struct MyView: View {
  @StateObject var myObject = MyObject(id: 1)
}但这并不意味着:
struct MyView: View {
  @StateObject var myObject: MyObject
  init(id: Int) {
    self.myObject = MyObject(id: id)
  }
}根据我的理解,@StateObject的作用是使视图成为对象的所有者。我使用的当前解决方法是传递已经初始化的MyObject实例,如下所示:
struct MyView: View {
  @ObservedObject var myObject: MyObject
  init(myObject: MyObject) {
    self.myObject = myObject
  }
}但现在,据我所知,创建对象的视图拥有它,而这个视图不拥有它。
谢谢。
发布于 2020-06-29 10:22:33
这是一个解决方案的演示。用Xcode 12+测试。
class MyObject: ObservableObject {
    @Published var id: Int
    init(id: Int) {
        self.id = id
    }
}
struct MyView: View {
    @StateObject private var object: MyObject
    init(id: Int = 1) {
        _object = StateObject(wrappedValue: MyObject(id: id))
    }
    var body: some View {
        Text("Test: \(object.id)")
    }
}来自苹果(对于所有类似@user832 832的用户):

发布于 2020-08-29 09:30:58
@Asperi给出的答案应该避免,苹果在他们的StateObject文档中这样说。
您不能直接调用这个初始化器。相反,在视图、应用程序或场景中使用@StateObject属性声明一个属性,并提供一个初始值。
苹果试图在引擎盖下进行大量优化,而不是对抗系统。
只需为您希望首先使用的参数创建一个具有Published值的Published。然后使用.onAppear()来设置它的值,其余的将由SwiftUI来完成。
代码:
class SampleObject: ObservableObject {
    @Published var id: Int = 0
}
struct MainView: View {
    @StateObject private var sampleObject = SampleObject()
    
    var body: some View {
        Text("Identifier: \(sampleObject.id)")
            .onAppear() {
                sampleObject.id = 9000
            }
    }
}发布于 2020-10-20 13:23:31
我想我找到了一个解决办法,可以控制用@StateObject包装的视图模型的实例化。如果在视图上不将视图模型设置为私有,则可以在视图上使用合成的元素,在那里您将能够毫无问题地控制它的实例化。如果需要以公共方式实例化视图,则可以创建一个工厂方法,该方法接收视图模型依赖关系,并使用内部合成的init。
import SwiftUI
class MyViewModel: ObservableObject {
    @Published var message: String
    init(message: String) {
        self.message = message
    }
}
struct MyView: View {
    @StateObject var viewModel: MyViewModel
    var body: some View {
        Text(viewModel.message)
    }
}
public func myViewFactory(message: String) -> some View {
    MyView(viewModel: .init(message: message))
}https://stackoverflow.com/questions/62635914
复制相似问题