我在尝试使文本字段在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)上运行Xcode 11.0 beta(11M336w)
编辑:简化的代码,仍然出现相同的错误。
struct SearchRoot : View {
@State var text: String = ""
var body: some View {
TextField($text,
placeholder: Text("type something here..."))
}
}
答案 0 :(得分:2)
如果在$
的{{1}}外部使用body
运算符,则编译器将发出错误。
按钮初始值设定项定义为:
init(action:@escaping()-> Void,@ViewBuilder label:()-> Label)
您正在转义的闭包中,在代码的第一个摘要中使用View
。
这意味着$
可能比action
寿命更长(转义),因此会出错。
第二个片段可以编译并正常运行。
答案 1 :(得分:0)
尤里卡! 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)
}
}
}