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

SwiftUI动态创建TextField列表:输入时键盘自动收起问题求助

问题分析与解决方案

问题根源

键盘输入单个字符就自动收起,本质是ForEach的元素标识逻辑出了问题。你当前用id: \.element作为ForEach的唯一标识,而NumberList遵循Hashable协议,其哈希值由id(UUID)和number共同计算。当你在TextField中输入字符时,number值改变,导致整个element的哈希值变化,ForEach会判定这是一个全新的元素,随即销毁旧的TextField并重建,最终造成输入框失去焦点、键盘收起。

修复代码

把ForEach的id改为\.element.id,利用UUID的唯一性和不变性,确保即使number变化,视图也不会被强制重建:

import SwiftUI

struct ContentView: View {
    
    @State var numberList: [NumberList] = []
    @State var numberTxt = 0
    
    var body: some View {
        VStack{
            // 改用UUID作为元素唯一标识,避免number变化触发视图重建
            ForEach(Array(numberList.enumerated()), id: \.element.id) { index, element in
                TextField("Number", text: $numberList[index].number)
            }
            
            Button {
                numberList.append(NumberList(number: ""))
            } label: {
                HStack{
                    Text("Add")
                    Image(systemName: "plus")
                }
            }
        }
    }
}

struct NumberList: Codable, Hashable{
    var id = UUID()
    var number: String
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

更简洁的写法优化

你也可以直接绑定数组元素,省去enumerated()的索引操作,代码更清晰:

// 替换原ForEach代码块
ForEach($numberList, id: \.id) { $item in
    TextField("Number", text: $item.number)
}

这种方式同样基于UUID标识元素,既解决键盘问题,也让代码更符合SwiftUI的绑定逻辑。

内容的提问来源于stack exchange,提问作者Ashley Dube

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 18:45:41