swift - 在 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
}
}
但是现在,据我了解,创建对象的视图拥有它,而这个视图不拥有。
谢谢。
解决方案
应该避免@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
}
}
}
推荐阅读
- java - 是否可以从包含 Java 中不同类型参数的子类中的基类调用构造函数?
- laravel - Laravel 如何使用请求全部更新多条记录
- android - 更新 fire-store 文档后后退按钮重新打开活动
- ruby - 如何在具有 nginx 服务器的同一系统上运行 2 个具有不同 ruby/rails 版本的项目
- flutter - 自定义类的方法中未显示 Flutter 小吃吧
- django - Django:如何自定义密码提示列表
- javascript - 函数参数类型
- flutter - 在 textFormField 上打开 Flutter 重定向
- java - Akka:在询问时丢失了`child.path.name`的参考
- javascript - 在 vue.js 中访问数组对象属性