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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 12:17:04