AttributeGraph:在操场中使用@State 通过属性检测到循环

Aka*_*wal 9 ios swift swiftui

我正在尝试在操场上使用 SwiftUI 的 @State。这是我的代码:

import UIKit
import PlaygroundSupport
import SwiftUI

struct ContentView: View {
    @State private var showGreeting = false

    var body: some View {

        Form {
            Button(action: {
                self.showGreeting.toggle()
            }) {
                Text("Toggle Greeting")
            }

            if showGreeting {
                Text("Hello World!")
            }
        }
    }
}

let viewController = UIHostingController(rootView: ContentView())

PlaygroundPage.current.liveView = viewController
Run Code Online (Sandbox Code Playgroud)

我可以在实时取景中看到按钮。但是如果我点击它,它不会显示文本。第二次点击确实会显示文本。进一步的点击在视觉上似乎没有任何区别。

每次单击时,我都会在日志区域收到以下消息:

=== AttributeGraph: cycle detected through attribute 38 ===
Run Code Online (Sandbox Code Playgroud)

需要一些帮助来理解在这种情况下这意味着什么以及为什么状态表现得不自然。

注意:我运行的是 macOS Mojave,所以我没有 SwiftUI 预览选项。我正在使用操场的实时预览。

Joh*_* M. 3

您的 SwiftUI 没有任何问题,并且在粘贴到新项目中时运行良好。

如果将 Form 更改为 VStack,则它在 Playground 中运行良好。使用列表会给你同样的错误。也许是一个错误,我会将其报告给Apple

根据我的经验,如果您暂时卡在 Mojave 上,只需设置一个可以运行模拟器的项目即可。编译和运行只需要几秒钟,当你的 SwiftUI 游乐场崩溃、出现类似这样的奇怪错误等时,你最终会节省时间。

  • 您提交了错误吗? (2认同)