我正在创建一个具有三个可能条件的SwiftUI视图,并希望根据满足的条件显示不同的内容。一个简化的例子:
struct ContentView: View {
@State var condition1 = true
@State var condition2 = false
var body: some View {
VStack {
if condition1 {
Text("text1")
} else if condition2 {
Text("text2")
} else {
Text("text3")
}
}.onAppear {
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
self.condition2 = true
}
DispatchQueue.main.asyncAfter(deadline: .now() + 4.0) {
self.condition1 = false
}
DispatchQueue.main.asyncAfter(deadline: .now() + 6.0) {
self.condition2 = false
}
}
}
}
我希望发生:
1)的UI显示text1
,当应用程序开始
2)用户界面仍然显示text1
2秒后(两个变量都是true
)
3)UI显示text2
4秒后(condition2
是true
,但condition1
现在是false
)
4)用户界面会显示text3
6后秒(两个变量都现在false
)
实际发生的情况:
1)UI text1
在应用程序启动时显示
2)UI text1
在2秒后显示
3)UI text2
在4秒后显示
4)UI text2
在6秒后继续显示
足够奇怪的是,如果我在UI代码中放置断点,则执行了显示text3的行,似乎UI从未更新。更奇怪的是,如果我Spacer().frame(width: 0, height: 0)
在其他情况下放一个,一切都会按预期进行。
这是SwiftUI中的错误还是在这里发生了什么?
好吧,实际上,如果要添加按钮并在按钮上切换状态,那么所有方法都可以正常工作,所以这是延迟更新的内容(可能是赛车,可能是错误……没有进一步研究)
这实际上是可行的解决方案(已通过Xcode 11.2 / iOS 13.2测试)...将这些条件相关视图分离到专用视图构建器中,如下所示
struct TestRefreshOnCondition: View {
@State var condition1 = true
@State var condition2 = false
var ConditionalView: some View {
Group {
if condition1 {
Text("text1")
} else if condition2 {
Text("text2")
} else {
Text("text3")
}
}
}
var body: some View {
VStack {
ConditionalView
}.onAppear {
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
self.condition2 = true
}
DispatchQueue.main.asyncAfter(deadline: .now() + 4.0) {
self.condition1 = false
}
DispatchQueue.main.asyncAfter(deadline: .now() + 6.0) {
self.condition2 = false
}
}
}
}