如何在视图之间传递@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 更改时更新视图