Fatal error: Accessing State<Binding<String>> outside View.body

Fatal error: Accessing State<Binding<String>> outside View.body

我在尝试让文本字段在 SwiftUI 中工作时遇到问题。 每当我尝试 运行 以下代码时,我都会得到 Fatal error: Accessing State> outside View.body

有人有什么建议吗?

struct SearchRoot : View {

    @State var text: String = ""

    var body: some View {
        HStack {
            TextField($text,
                      placeholder: Text("type something here..."))
            Button(action: {
                // Closure will be called once user taps your button
                print(self.$text)
            }) {
                Text("SEND")
            }
        }
    }
}

我在 macOS 10.15 Beta (19A471t) 上 运行ning Xcode 版本 11.0 beta (11M336w)

编辑:简化代码,仍然出现同样的错误。

struct SearchRoot : View {

    @State var text: String = ""

    var body: some View {
            TextField($text,
                      placeholder: Text("type something here..."))
    }
}

如果在 body 之外,在 View 中使用 $ 运算符,编译器将发出错误。 按钮初始化程序定义为:

init(action: @escaping () -> Void, @ViewBuilder label: () -> Label)

您在代码的 第一个片段 中的转义闭包中使用了 $

这意味着 action 可能比(逃避body 存在时间更长,因此会出现错误。

第二个代码段 编译并且对我来说工作正常。

尤里卡! SwiftUI 想要一个单一的事实来源。

我在原始代码片段中忽略的是,该结构位于选项卡式应用程序中。

为了解决这个问题,我需要在创建顶级 TabbedView 的结构中定义 @State var text: String = "",然后在 SearchRoot 中使用 $Binding。

我不确定这是按设计工作还是只是 beta 1 问题,但目前它是这样工作的。

struct ContentView : View {
    @State private var selection = 0
    @State private var text: String = "searching ex"

    var body: some View {
        TabbedView(selection: $selection){
            ShoppingListRoot().body.tabItemLabel(Text("Cart")).tag(0)
            SearchRoot(text: $text).body.tabItemLabel(Text("Search")).tag(1)
            StoreRoot().body.tabItemLabel(Text("Store")).tag(2)
            BudgetRoot().body
                .tabItemLabel(Text("Budget"))
                .tag(3)
            SettingsRoot().body
                .tabItemLabel(Text("Settings"))
                .tag(4)

        }
    }
}