gpt4 book ai didi

SwiftUI 通过另一个 View 实例设置状态变量

转载 作者:行者123 更新时间:2023-12-05 05:02:39 31 4
gpt4 key购买 nike

在 SwiftUI 中,我创建了一个结构,它应该根据某些状态变量创建不同的覆盖 View 。如果任何状态 bool 值为真,那么它应该返回自定义 View (ErrorOverlayLoadingOverlayEmptyView),如下所示:

struct OverlayContainer: View {
@State var isLoading: Bool = false
@State var isErrorShown: Bool = false

func setIsLoading(isLoading: Bool) {
self.isLoading = isLoading
}

func setIsErrorShown(isErrorShown: Bool) {
self.isErrorShown = isErrorShown
}

var body: some View {
Group {
if(isErrorShown) {
ErrorOverlay()
}
else if(isLoading) {
LoadingOverlay()
}
else {
EmptyView()
}
}
}
}

现在我已经在主页 View 中的一些内容上实现了覆盖,按钮应该改变状态并显示正确的覆盖,如下所示:

struct Home: View {

var body: some View {
let overlayContainer = OverlayContainer()

return HStack {
// Some more content here

Button(action: {
overlayContainer.setIsLoading(isLoading: true)
}) {
Text("Start loading")
}
Button(action: {
overlayContainer.setIsErrorShown(isErrorShown: true)
}) {
Text("Show error")
}
}.overlay(overlayContainer)
}
}

这不起作用:当我点击按钮时没有任何反应。为什么以及如何解决这个问题? (不使用绑定(bind),见下文)


附言。通过执行以下操作,我已经能够获得有效的解决方案:

  1. 将状态 bool 值提取到主视图
  2. 通过 OverlayContainer 的构造函数传递它们
  3. 更改状态 bool 值而不是在单击按钮时调用设置方法
  4. 更改 OverlayContainer,使其实现一个包含两个 bool 值的 init 方法
  5. 将 OverlayContainer 中的状态 bool 值更改为绑定(bind)。

但是,我想在 OverlayContainer 中实现状态,以便能够在不同的屏幕中重复使用它,而无需在所有这些屏幕中实现状态变量。首先是因为可能不止这两种情况。其次是因为并非所有屏幕都需要访问所有状态,而且我还没有找到一种通过 init 方法实现可选绑定(bind)的简单方法。

在我看来,所有这些状态都属于 OverlayContainer,更改状态应该尽可能简短和干净。到处定义状态感觉就像代码重复。也许我需要一个完全不同的架构?

最佳答案

应该改用Binding。这是可能的解决方案。

struct OverlayContainer: View {
@Binding var isLoading: Bool
@Binding var isErrorShown: Bool

var body: some View {
Group {
if(isErrorShown) {
ErrorOverlay()
}
else if(isLoading) {
LoadingOverlay()
}
else {
EmptyView()
}
}
}
}

struct Home: View {
@State var isLoading: Bool = false
@State var isErrorShown: Bool = false

var body: some View {
HStack {
// Some more content here

Button(action: {
self.isLoading = true
}) {
Text("Start loading")
}
Button(action: {
self.isErrorShown = true
}) {
Text("Show error")
}
}.overlay(OverlayContainer(isLoading: $isLoading, isErrorShown: $isErrorShown))
}
}

关于SwiftUI 通过另一个 View 实例设置状态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62043569/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com