【问题标题】:How to pass @State var between views?如何在视图之间传递@State var?
【发布时间】:2021-01-20 08:22:43
【问题描述】:

我不想有一个无法选择日期的视图,然后我想单击一个按钮,该按钮打开GraphView,并将@State var date 发送到另一个视图,所以我可以在 GraphView 中使用日期变量。

这是我到目前为止尝试过的,但它显示了错误:

传递给不带参数的调用的参数

struct ContentView: View {
    @State var showGraph = false
    
    var dateFormatterMonth: DateFormatter {
        let formatter = DateFormatter()
        formatter.setLocalizedDateFormatFromTemplate("M")
        
        return formatter
    }
    
    @State var date = Date()
    
    var body: some View {
        Button(action: {
            self.showGraph.toggle()
        }) {
            Text("Show Graph")
        }.sheet(isPresented: $showGraph){
            GraphView(date: date) {
            }
        }
        
        if showGraph {
            GraphView()
        }
        else {
            DatePicker("Date", selection: $date, displayedComponents: .date)
                .frame(width: 100, height: 20, alignment: .center)
            
            Text("Date is \(date, formatter: dateFormatterMonth)")
        }
    

【问题讨论】:

    标签: swift view swiftui


    【解决方案1】:

    你需要在GraphView中使用Binding,比如

    struct GraphView: View {
       @Binding var date: Date     // << here !!
    
    ...
    }
    

    然后像这样传递它,

        Button(action: {
            self.showGraph.toggle()
        }) {
            Text("Show Graph")
        }.sheet(isPresented: $showGraph){
            GraphView(date: $date) {        // << here !!
            }
        }
        
        if showGraph {
            GraphView(date: $date)   // << here !!
        }
    

    【讨论】:

    • 有没有办法可以将日期定义为全局变量?
    • @SwagMand 如果您有新问题,请创建一个新帖子。
    【解决方案2】:

    您的错误似乎是您试图将参数传递给没有参数的初始化程序。您可以将 GraphView 更改为类似

    struct GraphView: View {
    
        @Binding var date: Date
    
        var body: some View { ... }
    }
    

    然后你可以这样称呼它GraphView(date: $date)。

    应该可以的。

    【讨论】:

    • 有没有办法可以将日期定义为全局变量?
    • 如果在多个视图中需要该变量,@SwagMand EnvironmentObject 可能就是您要查找的内容。在下面查看我的答案的更多信息,并确保查看链接的文章。
    • 您可以定义一个全局变量,但是,我看不出这样做的原因。当您的应用程序的任何视图都可能需要它时,您应该使用它,例如登录信息,在这种情况下,它似乎只与您的应用程序中的一个视图相关,因此传递给 init 的一个变量听起来更好跨度>
    【解决方案3】:

    如果你想要一个可以在多个视图中使用的“全局”变量,你可以考虑使用@EnvironmentObject。

    因此,您必须定义一个新类,其中包含日期作为@Published var。然后你必须在你的视图中注入环境对象,并可以将它添加为@EnvironmentObject。

    在这里您可以找到更多信息:https://www.hackingwithswift.com/quick-start/swiftui/how-to-use-environmentobject-to-share-data-between-views

    为了使 Xcode 中的预览与环境对象一起工作,请记住在预览代码中使用 .environmentObject() 将其添加到视图中

    【讨论】:

    • 问题是,我希望用户能够输入一个值。然后我希望用户按下一个按钮,切换到另一个视图。另一个视图,从一个 rest api 中获取一些信息。而我想要做的是,根据用户输入链接的值进行编辑。因此,当输入为 1 时,链接为 www.example.com/1,当输入为 2 时,链接为 www.example.com/2
    猜你喜欢
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    相关资源
    最近更新 更多