【发布时间】:2022-01-08 09:04:28
【问题描述】:
编辑:
在下面运行@Yrb 的代码后,我意识到 ForEach 循环是一个红鲱鱼。这里的实际问题是,如果您尝试聚焦被键盘遮挡的字段, .focused 只会关闭键盘。可使用以下代码重现:
struct TestFields: View {
@State private var testField: String = ""
@FocusState private var focusedField: Int?
var body: some View {
Form {
ForEach(0..<20) { i in
TextField("test", text: $testField)
.focused($focusedField, equals: i)
}
}
.onSubmit {
if let current = focusedField {
focusedField = current + 1
}
}
}
}
运行上述程序,您将看到正常行为,直到您的设备尝试聚焦您看不到的字段。
不确定我是否应该关闭它并打开一个具有正确标题的新问题。
原始问题:
在将 .focused 用于动态数量的文本字段时,我遇到了一些奇怪的行为:
struct TestView: View {
@State private var options: [String] = Array(repeating: "", count: 7)
@FocusState private var focusedField: Int?
var body: some View {
Form {
ForEach($options.indices) { i in
TextField("Option \(i + 1)", text: $options[i])
.focused($focusedField, equals: i)
}
}
.onSubmit {
if let current = focusedField {
focusedField = current + 1
}
}
}
}
上面的代码完全按照预期工作。您可以将计数更改为任何数字,然后点击返回进度到下一个字段。但是,将任何其他文本字段添加到此表单会破坏这一点。例如:
struct TestView: View {
@State private var title: String = ""
@State private var description: String = ""
@State private var options: [String] = Array(repeating: "", count: 7)
@FocusState private var focusedField: Int?
var body: some View {
Form {
TextField("Title", text: $title)
.focused($focusedField, equals: 0)
TextField("Description", text: $description)
.focused($focusedField, equals: 1)
ForEach($options.indices) { i in
TextField("Option \(i + 1)", text: $options[i])
.focused($focusedField, equals: 2 + i)
}
}
.onSubmit {
if let current = focusedField {
print("setting focused field to \(current + 1)")
focusedField = current + 1
}
}
.onChange(of: focusedField) { newValue in
print("focused field changed to \(newValue)")
}
}
}
在这种情况下,表单会在最后一个字段之前停止并关闭键盘。通过观察focusedField,我可以看到当更改为最后一个字段时它被设置为nil。您添加的文本字段越多,此逻辑越早中断。我不确定是什么问题。
focused field changed to Optional(0)
setting focused field to 1
focused field changed to Optional(1)
setting focused field to 2
focused field changed to Optional(2)
setting focused field to 3
focused field changed to Optional(3)
setting focused field to 4
focused field changed to Optional(4)
setting focused field to 5
focused field changed to Optional(5)
setting focused field to 6
focused field changed to Optional(6)
setting focused field to 7
focused field changed to Optional(7)
setting focused field to 8
focused field changed to nil
【问题讨论】:
-
你绝对可以使用一个
@FocusedState和多个TextFields,这就是为什么它有一个修饰符接收Hashable绑定而不仅仅是Bool。
标签: ios swift swiftui swiftui-form