在SwiftUI中将一个视图的一个StateObject类传递给不同视图的另一个StateObject类



我有两个视图,每个视图都有自己的类。第一个视图具有类"的@StateObject;DataClass";初始化一个简单结构DataStruct:

struct View1 : View {
@StateObject var dataToPass = DataClass()

var body: some View {
NavigationView{
ZStack{
NavigationLink(destination: View2(data: dataToPass)){
Text("Navigation Link to View2")
}
}
}
}
}
struct dataStruct {
var variable1 : String
var variable2 : String
}
class DataClass : ObservableObject {
var data : dataStruct
init(){
data = dataStruct(variable1: "1", variable2: "2")
}
}

我正试图保留DataClass/dataStruct的相同实例,并将其传递给View2及其View2Class:

struct View2: View {

@ObservedObject var data : DataClass

@StateObject var game = View2Class(data: data)

var body: some View {
Text("Hello")
}
}
class View2Class : ObservableObject {
@ObservedObject var data : DataClass

init(data : DataClass){
self.data = data
}
}

我希望它只存在dataStruct的一个实例/初始化,因此dataClass和View2Class可以访问它。View2Class必须保持StateObject。到目前为止,我在View2的StateObject的声明中遇到了一个错误:";无法在属性初始值设定项中使用实例成员"data";属性初始值设定项在"self"可用之前运行"我确信这是一个简单的概念修复,但我现在还不理解。非常感谢。

不能使用data来声明game,因为data不是"可用";在CCD_ 4被建立之前。这就是你出现错误的原因。

在ObservableObject类中使用@Published尝试这种方法,并使用中的函数将DataStructDataClass传递到您的View2Class.onAppear {...}:

struct DataStruct {
var variable1: String
var variable2: String
}
class DataClass: ObservableObject {
@Published var data = DataStruct(variable1: "1", variable2: "2")
}
struct View2: View {
@ObservedObject var dataClass: DataClass
@StateObject var game = View2Class()

var body: some View {
Text("Hello")
.onAppear {
game.setData(dataClass.data)
}
}
}
class View2Class: ObservableObject {
@Published var data: DataStruct?
func setData(_ data: DataStruct){
self.data = data
}
}

@StateObject用于声明一个生存期自动绑定到屏幕上需要引用类型语义的UI(即,需要执行异步任务,而不是简单地保存@State更合适的数据(的真理源。将数据传递到一个对象中是没有意义的,因为这样它就不再是真理的来源,因为它有了依赖项——问题是对象不知道传递的数据何时发生了变化(SwiftUI通过其View结构和body函数本机支持哪个(。我建议重新设计你的数据流,使其更兼容SwiftUI,有一些很棒的WWDC数据流对话,比如这个。

要修复错误("无法使用实例成员‘data’…"(,请尝试以下操作:

struct View1 : View {
@StateObject var dataToPass = DataClass()

var body: some View {
NavigationView{
ZStack{
NavigationLink(destination: View2(data: dataToPass, game: View2Class(data: dataToPass))){
Text("Navigation Link to View2")
}
}
}
}
}
// ...
struct View2: View {
@ObservedObject var data: DataClass
@StateObject var game: View2Class

var body: some View {
Text("Hello")
}
}

相关内容

  • 没有找到相关文章

最新更新