Mar*_*rin 1 xcode swift swiftui swiftui-list
我TextField在Lista 里面有一个NavigationView,声明如下:
NavigationView {\n List {\n Section("Item Name") {\n TextField("", text: $itemName)\n .textInputAutocapitalization(.sentences)\n .disableAutocorrection(false)\n .textFieldStyle(.plain)\n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n在.onAppear的方法中NavigationView,我设置了文本字段的文本变量,该变量是用 声明的@State,如下所示:
@State var itemName: String = ""\nRun Code Online (Sandbox Code Playgroud)\n和:
\n.onAppear {\n itemName = "Hello, World!"\n}\nRun Code Online (Sandbox Code Playgroud)\n文本设置正确,但文本字段以某种方式不刷新\xe2\x80\x99。我可以这么说,因为我可以访问文本字段的文本属性并获取更新的值,并且当用户点击文本字段进行编辑时,文本会突然出现。
\n在我看来,当变量更改时文本字段更新其视图是一个问题。我是否必须调用 UIKit 的 SwiftUI 等效项layoutSubviews?或者我声明我的itemName变量是错误的?
最小可重复示例 (MRE):
\nstruct ItemView: View {\n\n @State var itemName: String = ""\n\n var body: some View {\n NavigationView {\n List {\n Section("Item Name") {\n TextField("", text: $itemName)\n .textInputAutocapitalization(.sentences)\n .disableAutocorrection(false)\n .textFieldStyle(.plain)\n }\n }\n .navigationTitle("Item")\n }\n .onAppear {\n itemName = "Hello, World!"\n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n任何帮助,将不胜感激。
\n它在预览中运行良好,但我采取了下一步并在模拟器中对其进行了测试,但失败了。这让我意识到问题所在。我们在从 开始的动画中经常看到这种情况.onAppear()。该视图是在视图实际显示在屏幕上之前设置和.onAppear()调用的,导致无法从.onAppear(). 几乎可以将其视为竞争条件。在调用更新之前,必须先设置视图并将其显示在屏幕上,并且需要额外的周期来完成此操作。因此,修复很简单:
.onAppear {
DispatchQueue.main.asyncAfter(deadline: .now()){
itemName = "Hello, World!"
}
}
Run Code Online (Sandbox Code Playgroud)
将其包裹在一个DispatchQueue.main.asyncAfter(deadline:). 这给了它时间来避免这个问题。
| 归档时间: |
|
| 查看次数: |
1532 次 |
| 最近记录: |