【问题标题】:How to pass the @State variable between classes?如何在类之间传递@State 变量?
【发布时间】:2022-01-08 20:20:18
【问题描述】:

根据本教程: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() 中没有输出(工作表为空白)。

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

【问题讨论】:

    标签: class swiftui textfield


    【解决方案1】:

    如果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 中的一个

    【讨论】:

    • 谢谢你,@jnpdx!它工作得很好,但也表明我需要一个更复杂的模型来解决我的最终任务......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    相关资源
    最近更新 更多