我认为滚动机制很混乱,因为您对所有
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。