我有TextField一個Listinside a NavigationView,宣告如下:
NavigationView {
List {
Section("Item Name") {
TextField("", text: $itemName)
.textInputAutocapitalization(.sentences)
.disableAutocorrection(false)
.textFieldStyle(.plain)
}
}
}
在 的.onAppear方法中NavigationView,我設定了文本欄位的文本變數,它是用 宣告的@State,如下所示:
@State var itemName: String = ""
和:
.onAppear {
itemName = "Hello, World!"
}
文本設定正確,但文本欄位不重繪 。我可以判斷,因為我可以訪問文本欄位的文本屬性并獲取更新的值,當用戶點擊文本欄位進行編輯時,文本突然出現。
在我看來,當變數更改時,文本欄位更新其視圖是一個問題。我必須呼叫與 UIKit 等效的 SwiftUIlayoutSubviews嗎?還是我宣告我的itemName變數錯誤?
最小可重現示例 (MRE):
struct ItemView: View {
@State var itemName: String = ""
var body: some View {
NavigationView {
List {
Section("Item Name") {
TextField("", text: $itemName)
.textInputAutocapitalization(.sentences)
.disableAutocorrection(false)
.textFieldStyle(.plain)
}
}
.navigationTitle("Item")
}
.onAppear {
itemName = "Hello, World!"
}
}
}
任何幫助,將不勝感激。
uj5u.com熱心網友回復:
它在預覽中運行良好,但我采取了下一步并在模擬器中對其進行了測驗,但它失敗了。這使我意識到問題所在。我們在從 開始的影片中看到了很多.onAppear()。在視圖實際出現在螢屏上之前設定和.onAppear()呼叫視圖,導致無法從.onAppear(). 幾乎可以將其視為一種競爭條件。在呼叫更新之前,必須設定視圖并顯示在螢屏上,并且需要一個額外的周期來執行此操作。因此,修復很簡單:
.onAppear {
DispatchQueue.main.asyncAfter(deadline: .now()){
itemName = "Hello, World!"
}
}
把它包在一個DispatchQueue.main.asyncAfter(deadline:). 這給了它時間來避免這個問題。
uj5u.com熱心網友回復:
我也能夠重現它。我同意 Yrb,似乎 onAppear 中的狀態突變發生在TextField更新期間,因此文本欄位沒有從狀態中獲取新值。
我能夠修復它的另一種方法是將狀態突變從NavigationView'.onAppear修飾符移動到TextField'.onAppear修飾符。如果你這樣做,你就不需要了,DispatchQueue.main.async因為 SwiftUI 會正確地將 onAppear 塊的執行與文本欄位的更新同步。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/476587.html
上一篇:我可以快速設定函式的執行順序嗎?
