【发布时间】:2021-12-24 01:04:08
【问题描述】:
这是我的代码
struct Home: View {
@State var status = UserDefaults.standard.value(forKey: "status") as? Bool ?? false
var userEmail = Auth.auth().currentUser?.email
@State private var hasTimeElapsed = false
var body: some View {
if self.status {
while (idkisrun == true) {
if group_array.contains(userEmail ?? "1") {
HomeScreen()
} else {
Verify()
}
}
} else {
VStack{
Login()
}
这是错误
error: closure containing control flow statement cannot be used with result builder 'ViewBuilder'
while (idkisrun == false) {
^
SwiftUI.ViewBuilder:2:30: note: struct 'ViewBuilder' declared here
@resultBuilder public struct ViewBuilder {
如何解决这个问题,以便能够等待变量为真,然后从那里继续代码?
【问题讨论】:
-
是什么导致
idkisrun改变值? (什么声明它?) -
这是处理 SwiftUI 的错误方法。与其等待
idkisrun改变它的值,不如写出View在idkisrun == true下的样子,然后在idkisrun == false下写下它的样子。可能使用多个View结构,可能在单个View内使用条件。 -
您想使用
onChange(of:perform:)来检测更改。回复here -
PhillipMills,idkisrun 是一个公共变量,它的值在上面运行的函数内从 true 变为 false。 Patrick Whynne,我试过了,但问题是,我的函数设置了“group_array”函数的值。 idkisrun 只是一种查看函数是否完成的方法。在继续之前,我需要更新数组。乔治,我想我不明白你的意思。
-
请阅读有关 SwftUI declaritive 设计的书籍或教程。永远不要在视图的渲染区域内使用
while循环。有用于观察变化的 API,这意味着您的函数在完成时告诉环境。而value(forKey:从UserDefaults检索Bool是错误的。基本上有bool(forKey:但在 SwiftUI 中也不鼓励这样做。使用@AppStorage属性包装器。
标签: swift function if-statement viewbuilder