我想要完成的事情
TextField用戶一次輸入一個值的視圖的垂直串列。在文本欄位中輸入值并按下鍵盤提交按鈕后,焦點將移動到下一個文本欄位。
我面臨的問題
鍵盤擋住了活動的文本欄位。我希望如果我使用ScrollView它會自動滾動到下一個焦點文本欄位,但事實并非如此。
然后我決定嘗試使用ScrollViewReader'sScrollViewProxy物件滾動到焦點文本欄位,這很有效!但不完全是。它滾動到選定的文本欄位,但不足以通過鍵盤。它似乎總是在鍵盤頂部的下方(無論是否有鍵盤工具列或自動更正欄或什么都沒有)。
這是我打電話后文本欄位大致結束位置的螢屏截圖proxy.scrollTo(focusedInput):
這是我希望它結束??的地方:
最少的代碼示例
struct ContentView: View {
@State var inputsValues: [String]
@FocusState var focusedInput: Int?
init() {
inputsValues = (0..<30).map { _ in "" }
}
var body: some View {
ScrollViewReader { proxy in
ScrollView {
VStack {
ForEach((0..<inputsValues.count), id: \.self) { i in
TextField("Value", text: $inputsValues[i])
.focused($focusedInput, equals: i)
.submitLabel(.next)
.id(i)
.onSubmit {
if (i 1) < inputsValues.count {
focusedInput = i 1
proxy.scrollTo(focusedInput)
} else {
focusedInput = nil
}
}
}
}
}
}.toolbar {
ToolbarItem(placement: .keyboard) {
Text("This is toolbar")
}
}
}
}
uj5u.com熱心網友回復:
在一個閉包中改變兩個以上的狀態(當它們以某種方式相關或影響一個區域時)處理得不是很好(或不可靠)。解決方法是將它們分開在不同的處理程式中。
使用 Xcode 13.3 / iOS 15.4 測驗

這是主要部分:
VStack {
// ... other code
.onSubmit {
// update state here !!
if (i 1) < inputsValues.count {
focusedInput = i 1
} else {
focusedInput = nil
}
}
}
}
.onChange(of: focusedInput) {
// react on state change here !!
proxy.scrollTo($0)
}
完整的測驗模塊在這里
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/465189.html
