首页 > 解决方案 > 在两个视图之间传递数据

问题描述

我想在 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")
            }
        }

    }
}

标签: swiftuixcode11ios13

解决方案


您的代码有几个错误:

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

推荐阅读