如何在视图之间传递@State var?

Posted

技术标签:

【中文标题】如何在视图之间传递@State var?【英文标题】:How to pass @State var between views? 【发布时间】: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)")
        
    

【问题讨论】:

【参考方案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

以上是关于如何在视图之间传递@State var?的主要内容,如果未能解决你的问题,请参考以下文章

防止 updateUIView 在 @State var 更改时更新视图

在 Flex 中,如何在 MXML 应用程序文件和 MXML 组件文件之间来回传递 var 对象

如何在 Swift 中的视图之间传递数据

切换时如何在UITabBar视图之间传递数据?

如何在视图控制器之间传递数据 - 不起作用

如何在swiftui中的视图之间传递数据?