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

SwiftUI待办App按钮仅首次获取TextField值问题求助

待办App添加任务重复旧值的问题解决

问题原因

你的Task结构体中id是不可变的let常量,每次实例化时生成唯一UUID。但你始终复用同一个nextTaskToBeAdded实例,多次添加到数组时,新添加的元素会和首次添加的元素拥有相同的id。由于SwiftUI的List依赖Identifiable的id来区分元素,重复的id会导致视图无法正确更新,看起来像是添加了旧值。

解决方案

每次点击添加按钮后,重置nextTaskToBeAdded为一个全新的Task实例,确保后续添加的任务都拥有唯一的id,让List能正确识别并渲染每个元素。

修改后的按钮代码

TextField("Next task's name", text: $nextTaskToBeAdded.name)
                
Button {
    taskArray.append(nextTaskToBeAdded)
    // 重置为新实例,生成新的UUID
    nextTaskToBeAdded = Task(name: "", completed: false, priority: 4)
} label: {
    Image(systemName: "plus")
}

原理说明

Swift中结构体是值类型,append操作会拷贝当前nextTaskToBeAdded的内容。但因为原实例的id固定,拷贝的元素id和原实例完全一致。当数组中存在多个id相同的元素时,List无法区分它们的更新,从而出现显示异常。重置为新实例后,每次添加的任务都会有唯一的id,List就能正常渲染所有任务。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 15:40:14