如何在类之间传递@State变量?

How to pass the @State variable between classes?

根据本教程:https://www.simpleswiftguide.com/swiftui-textfield-complete-tutorial/ 每当您将输入传递给 TextField 时,它都会“保存”在您添加到 TextField 的变量中。如何在类之间传递新值呢?

代码:

import SwiftUI

struct ContentView: View {
    @State var input: String = ""

    var body: some View {
        NavigationView{
        VStack {
            Text("Enter your text here:")
            TextField("Enter Text", text:$input)
                .multilineTextAlignment(.center)
            NavigationLink(destination:FinalView()){
                Text("Run")
            }

            }
        }
    }
    }

struct FinalView: View {

    var body: some View {
            Text(ContentView().input)
        }
}

我没有收到任何错误并且运行顺利,但是 FinalView() 中没有输出(sheet 为空白)。

这只是我在更复杂的应用程序中遇到的问题的最小可行版本,所以请不要寻找解决方法,而是帮助我寻找确切的答案或证明它根本不可行.谢谢!

如果FinalView不需要改变变量,那么你可以将它作为参数传递:

struct ContentView: View {
    @State var input: String = ""
    
    var body: some View {
        NavigationView{
            VStack {
                Text("Enter your text here:")
                TextField("Enter Text", text:$input)
                    .multilineTextAlignment(.center)
                NavigationLink(destination:
                                FinalView(input: input)
                ){
                    Text("Run")
                }
            }
        }
    }
}

struct FinalView: View {
    var input : String
    
    var body: some View {
       Text(input)
    }
}

如果你需要双向通信(例如子视图需要改变变量),你可以使用@Binding:

struct ContentView: View {
    @State var input: String = ""
    
    var body: some View {
        NavigationView{
            VStack {
                Text("Enter your text here:")
                TextField("Enter Text", text:$input)
                    .multilineTextAlignment(.center)
                NavigationLink(destination:
                                FinalView(input: $input)
                ){
                    Text("Run")
                }
            }
        }
    }
}

struct FinalView: View {
    @Binding var input : String
    
    var body: some View {
        TextField("", text: $input)
    }
}

请注意,尝试进入父视图 (ContentView().input) 将 无效 -- 创建一个 新实例 ContentView 与您期望的 input 不同。

不相关的旁注:你的层次结构中应该只有 一个 NavigationView -- 我已经删除了 FinalView[=19= 中的那个]