SwiftUI TextField 在变量更改时不刷新

Mar*_*rin 1 xcode swift swiftui swiftui-list

TextFieldLista 里面有一个NavigationView,声明如下:

\n
NavigationView {\n    List {\n        Section("Item Name") {\n            TextField("", text: $itemName)\n                .textInputAutocapitalization(.sentences)\n                .disableAutocorrection(false)\n                .textFieldStyle(.plain)\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

.onAppear的方法中NavigationView,我设置了文本字段的文本变量,该变量是用 声明的@State,如下所示:

\n
@State var itemName: String = ""\n
Run Code Online (Sandbox Code Playgroud)\n

和:

\n
.onAppear {\n    itemName = "Hello, World!"\n}\n
Run Code Online (Sandbox Code Playgroud)\n

文本设置正确,但文本字段以某种方式不刷新\xe2\x80\x99。我可以这么说,因为我可以访问文本字段的文本属性并获取更新的值,并且当用户点击文本字段进行编辑时,文本会突然出现。

\n

在我看来,当变量更改时文本字段更新其视图是一个问题。我是否必须调用 UIKit 的 SwiftUI 等效项layoutSubviews?或者我声明我的itemName变量是错误的?

\n

最小可重复示例 (MRE):

\n
struct 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}\n
Run Code Online (Sandbox Code Playgroud)\n

任何帮助,将不胜感激。

\n

Yrb*_*Yrb 5

它在预览中运行良好,但我采取了下一步并在模拟器中对其进行了测试,但失败了。这让我意识到问题所在。我们在从 开始的动画中经常看到这种情况.onAppear()。该视图是在视图实际显示在屏幕上之前设置和.onAppear()调用的,导致无法从.onAppear(). 几乎可以将其视为竞争条件。在调用更新之前,必须先设置视图并将其显示在屏幕上,并且需要额外的周期来完成此操作。因此,修复很简单:

.onAppear {
    DispatchQueue.main.asyncAfter(deadline: .now()){
        itemName = "Hello, World!"
    }
}
Run Code Online (Sandbox Code Playgroud)

将其包裹在一个DispatchQueue.main.asyncAfter(deadline:). 这给了它时间来避免这个问题。