我想知道当前(在询问时,第一个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
复制相似问题