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

SwiftUI中修改ForEach导航项TextField内容并保存的问题

问题解决:修改生日名称后返回列表不保存的问题

你的问题核心在于修改后的文本没有传递给视图模型完成更新,调用更新方法时传入的还是原始的birthday实例,没带上修改后的名字。下面是具体修复步骤和代码:

1. 修复EditBirthdayView的保存逻辑

点击保存时,要用修改后的textfieldName生成更新后的BirthdayModel实例,再传给视图模型的更新方法:

struct EditBirthdayView: View {
    @EnvironmentObject var vm: BirthdayViewModel
    @State var textfieldName: String = ""
    @Environment(\.dismiss) var dismiss // iOS15+可用,替代旧的presentationMode
    var birthday: BirthdayModel
    
    var body: some View {
        NavigationStack { // iOS16+用这个替代NavigationView,低版本可保留原NavigationView
            VStack(spacing: 20) {
                TextField("Name...", text: $textfieldName)
                    .textFieldStyle(.roundedBorder)
                
                Button {
                    saveButtonPressed()
                } label: {
                    Text("Save")
                        .padding()
                        .background(Color.blue)
                        .foregroundColor(.white)
                        .cornerRadius(8)
                }
            }
            .padding()
            .navigationTitle("Edit Birthday")
            .onAppear {
                // 去掉不必要的延迟,直接赋值即可
                textfieldName = birthday.name
            }
        }
    }
    
    func saveButtonPressed() {
        // 生成更新后的生日实例,保留原实例的其他属性(比如日期、ID)
        let updatedBirthday = BirthdayModel(
            id: birthday.id, // 假设模型有唯一ID标识
            name: textfieldName,
            date: birthday.date
            // 其他属性按需保留
        )
        // 调用视图模型更新方法,传入新实例
        vm.updateItem(birthday: updatedBirthday)
        dismiss()
    }
}

2. 确保ViewModel的updateItem方法正确实现

视图模型需要能找到对应条目并替换成更新后的实例,假设searchableUsers是存储生日数据的数组,示例实现如下:

class BirthdayViewModel: ObservableObject {
    @Published var searchableUsers: [BirthdayModel] = []
    
    // 更新逻辑:通过ID找到对应条目并替换
    func updateItem(birthday: BirthdayModel) {
        guard let index = searchableUsers.firstIndex(where: { $0.id == birthday.id }) else {
            return
        }
        searchableUsers[index] = birthday
    }
    
    // 你已有的deleteBirthday、addBirthday等方法
}

3. 补充模型定义说明

确保BirthdayModel是值类型(struct)且遵循Equatable/Identifiable,示例:

struct BirthdayModel: Identifiable, Equatable {
    let id: UUID = UUID()
    var name: String
    var date: Date
}

修改完成后,在编辑视图修改名称并点击保存,视图模型会更新数组内的对应条目,返回主视图后列表就会显示修改后的名字了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 09:02:56