SwiftUI TextField仅允许单次修改一个字符的问题求助
问题原因与解决办法
问题出在你用了id:\.self作为ForEach的标识。当你修改TextField里的文字时,idea的字符串值会立刻改变,对应的id也跟着变化,ForEach会认为这个元素被替换了,直接重建对应的TextField视图,导致输入焦点丢失。
解决方案1:使用Identifiable结构体(推荐)
创建一个带唯一ID的结构体来存储每个想法,这样修改文字不会改变元素的标识,ForEach就能稳定跟踪每个元素,不会随便重建视图:
struct Idea: Identifiable { let id = UUID() var text: String } @State private var exampleIdeas = [ Idea(text: "Sweets"), Idea(text: "Chocolate"), Idea(text: "Cake") ] // 视图部分 ForEach($exampleIdeas, editActions: .delete) { $idea in TextField("Idea", text: $idea.text) }
解决方案2:用数组索引作为ID(临时方案)
如果不想额外定义结构体,可以用数组的索引来标识元素,但要注意:如果后续对数组做删除、排序这类会改变索引的操作,可能会出现异常,只适合简单场景使用:
ForEach(Array(exampleIdeas.enumerated()), id: \.offset) { index, _ in TextField("Idea", text: $exampleIdeas[index]) }
内容的提问来源于stack exchange,提问作者Laura Edwards
相关产品推荐
相关产品推荐

