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

Swift 5.5中List直接绑定列表项功能的使用方法及TextField焦点丢失问题排查

解决SwiftUI List绑定TextField输入失焦的问题

我之前也碰到过一模一样的问题!核心原因就出在你用id: \.self作为List的条目标识符上。

当你在TextField里输入字符时,绑定的item值会立刻改变,而你把这个可变的字符串当成了列表项的唯一标识。SwiftUI的List会认为原来的条目已经“消失”了,会销毁旧的行视图并创建一个新的——这就是为什么输入一个字符后TextField就失去焦点的原因。

解决方案:使用稳定的标识符

最靠谱的做法是给你的列表项创建一个带稳定ID的数据模型,利用SwiftUI的Identifiable协议来让List正确跟踪每个条目:

首先定义一个遵循Identifiable的结构体:

struct ListItem: Identifiable {
    let id = UUID() // 这个ID是固定不变的
    var name: String // 用来存储可编辑的内容
}

然后修改你的ContentView:

struct ContentView: View {
    @State private var items = [
        ListItem(name: "Item A"),
        ListItem(name: "Item B"),
        ListItem(name: "Item C")
    ]
    
    var body: some View {
        List($items) { $item in
            TextField("Edit Item", text: $item.name)
        }
    }
}

这样一来,即使你修改name的值,每个条目的id始终不变,List不会错误地重建行视图,TextField就能保持焦点正常输入了。

另一种快速方案(适合简单场景)

如果不想额外定义结构体,也可以用数组的索引作为标识符,这样即使元素内容变化,索引是稳定的:

struct ContentView: View {
    @State private var items = ["Item A", "Item B", "Item C"]
    
    var body: some View {
        List($items.indices, id: \.self) { index in
            TextField("Edit Item", text: $items[index])
        }
    }
}

不过这种方法要注意:如果你的列表有排序、删除、移动元素的操作,索引可能会带来意外问题,所以更推荐第一种用Identifiable模型的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 23:29:05