swiftui - 在两个视图之间传递数据
问题描述
我想在 watchOS 6 上创建一个安静的简单应用程序,但是在 Apple 更改 Xcode 11 beta 5 中的 ObjectBindig 之后,我的应用程序不再运行。我只是想在两个视图之间同步数据。
所以我用新的@Published 重写了我的应用程序,但我无法真正设置它:
class UserInput: ObservableObject {
@Published var score: Int = 0
}
struct ContentView: View {
@ObservedObject var input = UserInput()
var body: some View {
VStack {
Text("Hello World\(self.input.score)")
Button(action: {self.input.score += 1})
{
Text("Adder")
}
NavigationLink(destination: secondScreen()) {
Text("Next View")
}
}
}
}
struct secondScreen: View {
@ObservedObject var input = UserInput()
var body: some View {
VStack {
Text("Button has been pushed \(input.score)")
Button(action: {self.input.score += 1
}) {
Text("Adder")
}
}
}
}
解决方案
您的代码有几个错误:
1)你没有把你ContentView
的 a NavigationView
,所以两个视图之间的导航从未发生过。
2)您以错误的方式使用数据绑定。如果您需要第二个视图依赖于属于第一个视图的某个状态,则需要将对该状态的绑定传递给第二个视图。在您的第一个视图和第二个视图中,您都有一个@ObservedObject
创建的内联:
@ObservedObject var input = UserInput()
因此,第一个视图和第二个视图处理两个完全不同的对象。相反,您有兴趣在score
视图之间共享。让第一个视图拥有该UserInput
对象,并将对分数整数的绑定传递给第二个视图。这样,两个视图都将使用相同的值(您可以复制粘贴下面的代码并自己尝试)。
import SwiftUI
class UserInput: ObservableObject {
@Published var score: Int = 0
}
struct ContentView: View {
@ObservedObject var input = UserInput()
var body: some View {
NavigationView {
VStack {
Text("Hello World\(self.input.score)")
Button(action: {self.input.score += 1})
{
Text("Adder")
}
NavigationLink(destination: secondScreen(score: self.$input.score)) {
Text("Next View")
}
}
}
}
}
struct secondScreen: View {
@Binding var score: Int
var body: some View {
VStack {
Text("Button has been pushed \(score)")
Button(action: {self.score += 1
}) {
Text("Adder")
}
}
}
}
#if DEBUG
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
#endif
如果你真的需要它,你甚至可以将整个UserInput
对象传递给第二个视图:
import SwiftUI
class UserInput: ObservableObject {
@Published var score: Int = 0
}
struct ContentView: View {
@ObservedObject var input = UserInput() //please, note the difference between this...
var body: some View {
NavigationView {
VStack {
Text("Hello World\(self.input.score)")
Button(action: {self.input.score += 1})
{
Text("Adder")
}
NavigationLink(destination: secondScreen(input: self.input)) {
Text("Next View")
}
}
}
}
}
struct secondScreen: View {
@ObservedObject var input: UserInput //... and this!
var body: some View {
VStack {
Text("Button has been pushed \(input.score)")
Button(action: {self.input.score += 1
}) {
Text("Adder")
}
}
}
}
#if DEBUG
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
#endif
推荐阅读
- javascript - Javascript从属性值匹配的对象数组中返回数组
- powershell - 如何跟踪 AD 用户上次访问/映射共享文件夹的日期和时间
- python - Python在同一文件夹中调用.txt文件
- jupyter-notebook - Jupyter webserver,无法查看目录和文件
- macos - 在 MAC OSX 上公证后,在使用 Unix 可执行文件装订票证时面临问题
- couchdb - 获取在特定时间范围内更新的来自 couchDB 的所有文档
- python - Python - 如何使用字典来映射字符串的单个字符
- javascript - 以下html不是jinjia2渲染的
- jquery - 哪个 jQuery 多元素选择器优化得更好
- amazon-web-services - 错误:路由表和网络网关属于不同的网络