iOS系统下被键盘遮挡的TextField使用.focused修饰符失效问题
编辑更新
运行@Yrb提供的代码后确认,ForEach循环只是干扰项,实际问题为:在iOS系统中,若尝试通过.focused修饰符聚焦被键盘遮挡的TextField,系统会直接关闭键盘。可通过以下代码复现该问题:
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 } } } }
运行上述代码时,输入框跳转逻辑一切正常,直到设备尝试聚焦当前不可见的输入框时,就会触发异常表现。
暂不确定是否需要关闭原问题,重新发布标题准确的新问题。
原始问题
我在为动态数量的TextField设置.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 } } } }
上述代码运行完全符合预期,可任意调整数组长度,点击回车均可正常跳转到下一个输入框。但在Form中添加其他TextField后,该逻辑就会被破坏,示例代码如下:
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的变化可发现,尝试将焦点赋值给靠后的输入框时,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
内容的提问来源于stack exchange,提问作者LLooggaann
相关产品推荐
相关产品推荐

