首页 > 解决方案 > 在 SwiftUI 中使用参数初始化 @StateObject

问题描述

我想知道目前(在询问时,第一个 Xcode 12.0 Beta 版)是否有一种方法来使用@StateObject来自初始化程序的参数来初始化 a 。

更具体地说,这段代码可以正常工作:

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
  }
}

但是现在,据我了解,创建对象的视图拥有它,而这个视图不拥有。

谢谢。

标签: swiftswiftuixcode12

解决方案


应该避免@Asperi 给出的答案 Apple 在他们的 StateObject 文档中这么说。

您不直接调用此初始化程序。相反,在 View、App 或 Scene 中声明具有 @StateObject 属性的属性,并提供初始值。

苹果试图在后台进行很多优化,不要与系统抗争。

只需为您首先要使用的参数创建ObservableObject一个值。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
            }
    }
}

推荐阅读