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)
}
}
}
我在尝试让文本字段在 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)
}
}
}