【问题标题】:SwiftUI: Waiting for variable to be trueSwiftUI:等待变量为真
【发布时间】: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 改变它的值,不如写出Viewidkisrun == 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


【解决方案1】:

尝试将“idkisrun”作为已发布变量(如果不是)。比尝试将(while)运算符更改为(if)。它应该有效。此外,“idkisrun”应仅在主线程中更改以更新视图。 希望它会有所帮助,祝你好运!)

【讨论】:

  • 我已经知道它适用于“if”。我遇到的问题是将“idkisrun”设置为 true 的函数在运行“if”语句之后才完成运行。我需要我的那部分代码“等待”直到函数完成运行
  • Trere 是一个可以提供帮助的东西——mvvm 架构。尝试更新函数中的“idkisrun”,您正在等待响应
猜你喜欢
  • 2017-01-08
  • 2014-08-26
  • 1970-01-01
  • 1970-01-01
  • 2014-10-09
  • 2015-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多