使用 SwiftUI 中的普通键盘从字段移动时,使用 decimalKeyboard 的 TextFields 不滚动到可见区域
TextFields using decimalKeyboard not scrolling to visible area when moved from a field using the normal keyboard in SwiftUI
知道如果前一个字段使用普通键盘,为什么 Field 3
和 Field 5
在活动时不可见吗?
在下面的代码中,如果您点击 Field 1
并且在您点击 Field 3
或 Field 5
之后立即,它们将不可见;他们被键盘隐藏了。
请注意 Field 3
和 Field 5
使用 decimalPad
键盘,而其余字段使用标准键盘。
struct TextFieldScrollingIssue: View {
@State private var testInput:String = ""
var body: some View {
VStack{
Form {
TextField("Field 1", text:$testInput)
Spacer()
Spacer()
Spacer()
Spacer()
Spacer()
Spacer()
Spacer()
Section(header: Text("Section 1: ")) {
TextField("Field 2", text:$testInput)
TextField("Field 3", text:$testInput)
.keyboardType(.decimalPad)
}
Section(header: Text("Section 2: ")) {
TextField("Field 4", text:$testInput)
TextField("Field 5", text:$testInput)
.keyboardType(.decimalPad)
}
}
}
}
}
我认为滚动机制很混乱,因为您对所有 TextFields
使用了相同的变量。显然,在生产中,您永远不会遇到这种情况。修复很简单,使用不同的变量:
struct TextFieldScrollingIssue: View {
@FocusState var isFocused: String?
@State private var testInput:String = ""
@State private var decimalInput:String = ""
var body: some View {
VStack{
ScrollViewReader { scroll in
Form {
TextField("Field 1", text:$testInput)
.id("Field 1")
.focused($isFocused, equals: "Field 1")
Text(isFocused?.description ?? "nil")
Spacer()
Spacer()
Spacer()
Spacer()
Spacer()
Spacer()
Section(header: Text("Section 1: ")) {
TextField("Field 2", text:$testInput)
.id("Field 2")
.focused($isFocused, equals: "Field 2")
TextField("Field 3", text:$decimalInput)
.id("Field 3")
.focused($isFocused, equals: "Field 3")
.keyboardType(.decimalPad)
}
Section(header: Text("Section 2: ")) {
TextField("Field 4", text:$testInput)
.id("Field 4")
.focused($isFocused, equals: "Field 4")
TextField("Field 5", text:$decimalInput)
.id("Field 5")
.focused($isFocused, equals: "Field 5")
.keyboardType(.decimalPad)
}
}
.onChange(of: isFocused) { _ in
if let isFocused = isFocused {
DispatchQueue.main.async {
withAnimation {
scroll.scrollTo(isFocused)
}
}
}
}
}
}
}
}
编辑:
根据评论,我能够重现。编辑代码以使用 ScrollviewReader
、@FocusState
和视图 ID 进行更正。
知道如果前一个字段使用普通键盘,为什么 Field 3
和 Field 5
在活动时不可见吗?
在下面的代码中,如果您点击 Field 1
并且在您点击 Field 3
或 Field 5
之后立即,它们将不可见;他们被键盘隐藏了。
请注意 Field 3
和 Field 5
使用 decimalPad
键盘,而其余字段使用标准键盘。
struct TextFieldScrollingIssue: View {
@State private var testInput:String = ""
var body: some View {
VStack{
Form {
TextField("Field 1", text:$testInput)
Spacer()
Spacer()
Spacer()
Spacer()
Spacer()
Spacer()
Spacer()
Section(header: Text("Section 1: ")) {
TextField("Field 2", text:$testInput)
TextField("Field 3", text:$testInput)
.keyboardType(.decimalPad)
}
Section(header: Text("Section 2: ")) {
TextField("Field 4", text:$testInput)
TextField("Field 5", text:$testInput)
.keyboardType(.decimalPad)
}
}
}
}
}
我认为滚动机制很混乱,因为您对所有 TextFields
使用了相同的变量。显然,在生产中,您永远不会遇到这种情况。修复很简单,使用不同的变量:
struct TextFieldScrollingIssue: View {
@FocusState var isFocused: String?
@State private var testInput:String = ""
@State private var decimalInput:String = ""
var body: some View {
VStack{
ScrollViewReader { scroll in
Form {
TextField("Field 1", text:$testInput)
.id("Field 1")
.focused($isFocused, equals: "Field 1")
Text(isFocused?.description ?? "nil")
Spacer()
Spacer()
Spacer()
Spacer()
Spacer()
Spacer()
Section(header: Text("Section 1: ")) {
TextField("Field 2", text:$testInput)
.id("Field 2")
.focused($isFocused, equals: "Field 2")
TextField("Field 3", text:$decimalInput)
.id("Field 3")
.focused($isFocused, equals: "Field 3")
.keyboardType(.decimalPad)
}
Section(header: Text("Section 2: ")) {
TextField("Field 4", text:$testInput)
.id("Field 4")
.focused($isFocused, equals: "Field 4")
TextField("Field 5", text:$decimalInput)
.id("Field 5")
.focused($isFocused, equals: "Field 5")
.keyboardType(.decimalPad)
}
}
.onChange(of: isFocused) { _ in
if let isFocused = isFocused {
DispatchQueue.main.async {
withAnimation {
scroll.scrollTo(isFocused)
}
}
}
}
}
}
}
}
编辑:
根据评论,我能够重现。编辑代码以使用 ScrollviewReader
、@FocusState
和视图 ID 进行更正。