You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 06:24:07