【问题标题】:How to pass variable from one view to another in SwiftUI如何在 SwiftUI 中将变量从一个视图传递到另一个视图
【发布时间】:2019-10-18 16:05:04
【问题描述】:

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

我尝试在视图 1 中创建一个新结构并在视图 2 中访问该变量。

// 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 等,还是您正在寻找一个全球性的事实来源?
  • 感谢您的回复,正在寻找一个全球性的真相来源。不知何故,我可以在应用程序的所有 swift 文件中更改 count 的值。

标签: ios swiftui


【解决方案1】:

如果在View1 中使用View2,您可以这样做:

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/EnvironmentVariables。最好的方法是将环境变量添加到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")
        }
    }
}

【讨论】:

  • 感谢您的帮助,但视图 2 位于单独的视图中
  • 你能给我们更多关于视图层次结构的上下文(即视图如何相互关联?)你也许可以使用 observableObject。
  • 让我解释一下这个项目。我正在尝试构建一个用于学习 swiftui 的示例 WatchOS 应用程序。在第一个视图中,按下一个按钮有两个按钮,值会增加并发生更改。第二个按钮减一,数值减一。在视图 2 上,有一个重置按钮,按下该按钮应将变量更改为 0。视图 1 中的所有内容都运行良好。但我无法调用变量来重置视图一中的值。希望能稍微解决问题。感谢您的所有帮助
  • 我已经编辑了答案,希望对您有所帮助!我的主要问题是你如何从 view1 快速到 view2?
  • 这很有帮助。我试图将一个变量从主视图传递到另一个视图。帮助我的关键是确保在主视图中声明了@State,并在子视图中声明了@Binding。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-24
  • 2020-05-18
  • 2015-10-27
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
  • 2019-11-18
相关资源
最近更新 更多