iOS 18中含TextField绑定与焦点状态的动态List触发无限循环
iOS 18 动态List绑定TextField触发无限循环的原因分析
问题根源:不稳定的行ID导致视图无限重建
你的代码里,Row类的id实现存在致命问题——每次访问id都会生成全新的UUID:
var id: String { UUID().uuidString }
在iOS 18之前,SwiftUI对动态List的渲染逻辑对ID稳定性的容忍度较高,但iOS 18优化了List的差异化渲染机制:一旦行的ID发生变化,List会直接销毁旧的行视图,重新创建新的视图实例。
无限循环的触发链路:
- List遍历数据源时,每次获取
row.id都会得到新值,List判定该行需要重新创建 - 新的
MyTextFieldView实例被初始化,内部的@FocusState会触发视图状态更新 - 视图更新又会促使List重新遍历数据源,再次生成新的
row.id,形成无限循环
静态List不会出现这个问题,是因为静态行的标识是固定的,不存在反复销毁重建视图的触发条件。
修复验证:
把id改成初始化时固定的静态值,循环问题就会消失:
final class Row: ObservableObject, Identifiable { @Published var text: String = "" let id: String = UUID().uuidString // 初始化时生成一次,固定ID }
内容的提问来源于stack exchange,提问作者Nonouf
相关产品推荐
相关产品推荐

