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
相关产品推荐
相关产品推荐

