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
相关产品推荐
相关产品推荐

