如何在SwiftUI中从一个视图传递变量到另一个视图

5

我正在尝试在SwiftUI中从一个视图传递一个变量到另一个视图。我有一个重置按钮,我想在另一个视图中将变量设置为零。

我尝试在第一个视图中创建一个新的结构体,并在第二个视图中访问该变量。

// View 1

@State var count = MyNumber.number

// Body of app

Button(action: {self.count = self.count-10}) {
                    Text("-")   
                }
Text("\(count)")

struct MyNumber {
    static var number = 0
}

// View 2

 @State var countit = MyNumber.number

// Body

Button(action: {self.countit = 0}) {
            Text("Reset")
            }

在视图1中显示的文本仍然显示在视图1中计算得出的数字。


你能解释一下这些视图之间的关系吗?View2 是否会在 View1 中使用,或者你是在寻找一个全局的真相源? - 39fredy
谢谢您的回复,正在寻找一个全局数据源。有一种方式可以更改应用程序中所有Swift文件中count的值。 - iruleee
1个回答

6
如果 View2 正在被使用于 View1 中,你可以像这样做:

View1:

struct FirstView: View {
    @State var count = 0
    var body: some View {
        VStack{
            Text("\(self.count)")
            Button(action:
                {self.count = self.count-10})
            {
                Text("-")
            }
            SecondView(count: self.$count)
        }
    }
}

还有 View2:

struct SecondView: View {
    @Binding var count: Int
    var body: some View {
        Button(action: {self.count = 0}) {
            Text("Reset")
        }
    }
}

编辑

如果它们是完全不同的视图,并且需要一个单一的真实来源,您可以使用observableObject/环境变量。最好的方法是将环境变量添加到ContentView中,在那里它首先在SceneDelegate中定义。

ContentView().environmentObject(SourceOfTruth())

这是SourceOfTruth:

class SourceOfTruth: ObservableObject{
    @Published var count = 0
}

接下来,您可以使用 EnvironmentObjects 将其传递给其他视图:

这里是 ContentView

struct ContentView: View {
    @EnvironmentObject var truth: SourceOfTruth
    var body: some View {
        VStack {
            FirstView()
            SecondView()
        }
    }
}

这里是 FirstView

struct FirstView: View {
    @EnvironmentObject var truth: SourceOfTruth
    var body: some View {
       VStack{
        Text("\(self.truth.count)")
           Button(action:
            {self.truth.count = self.truth.count-10})
           {
               Text("-")
           }
       }
    }
}

下面是SecondView

struct SecondView: View {
    @EnvironmentObject var truth: SourceOfTruth
    var body: some View {
        Button(action: {self.truth.count = 0}) {
            Text("Reset")
        }
    }
}

谢谢你的帮助,但是View 2在一个单独的视图中。 - iruleee
我已经编辑了答案,希望能帮到你!我的主要问题是如何从view1切换到view2? - 39fredy
非常感谢。在第一个视图上,环境对象完美地工作,但是一旦我在第二个视图的按钮操作中放置了self.truth.count = 0,它就会在启动时崩溃,并显示错误Fatal error: No observable object of type SourceOfTruth.Type found - iruleee
你能否发布你代码的图片或其他东西。我需要了解视图1和视图2之间的关系,也就是说,你是如何从视图1切换到视图2的。 - 39fredy
1
这非常有帮助。我试图从一个主视图传递一个变量到另一个视图。帮助我的关键是确保在主视图中声明了@ State,在子视图中声明了@ Binding。 - FontFamily
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接