if let subLists = todoItem.sub?.allObjects as? [ToDoSubModel] { ForEach(subLists.indices, id: \.self) { index in let item = subLists[index] Divider() HStack { Image(systemName: item.isChecked ? "checkmark.circle.fill" : "circle") .foregroundColor(item.isChecked ? settingsVM.ThemeColors[settingsVM.themeColorNum].color : Color(uiColor: .secondaryLabel)) .onTapGesture { subLists[index].isChecked.toggle() do { try viewContext.save() // 保存更改到持久化存储 } catch let error as NSError { print("Could not save. \(error), \(error.userInfo)") } } } }}这段代码的子实体的值更改了但视图没有刷新
时间: 2024-01-27 19:03:04 浏览: 153
这段代码中的视图没有刷新是因为 `subLists` 是一个常量数组,修改它的元素并不会触发视图的更新。解决方法是使用 `@FetchRequest` 将数据绑定到视图上,当数据发生变化时,视图会自动更新。具体实现可以参考官方文档中的示例:https://developer.apple.com/documentation/swiftui/fetchrequest
相关问题
if let subLists = todoItem.sub?.allObjects as? [ToDoSubModel] { ForEach(subLists.indices, id: \.self) { index in let item = subLists[index] Divider() HStack { Image(systemName: item.isChecked ? "checkmark.circle.fill" : "circle") .foregroundColor(item.isChecked ? settingsVM.ThemeColors[settingsVM.themeColorNum].color : Color(uiColor: .secondaryLabel)) .onTapGesture { subLists[index].isChecked.toggle() // 反转 isChecked 值 } } } }这段代码的子实体的值更改了但视图没有刷新
在这段代码中,当你更改子实体的值后,你需要调用NSManagedObjectContext的save()方法将更改保存到持久化存储中,以便Core Data可以更新视图。你可以像这样修改代码:
```
if let subLists = todoItem.sub?.allObjects as? [ToDoSubModel] {
ForEach(subLists.indices, id: \.self) { index in
let item = subLists[index]
Divider()
HStack {
Image(systemName: item.isChecked ? "checkmark.circle.fill" : "circle")
.foregroundColor(item.isChecked ? settingsVM.ThemeColors[settingsVM.themeColorNum].color : Color(uiColor: .secondaryLabel))
.onTapGesture {
subLists[index].isChecked.toggle()
do {
try viewContext.save() // 保存更改到持久化存储
} catch let error as NSError {
print("Could not save. \(error), \(error.userInfo)")
}
}
}
}
}
```
当你更改子实体的值时,调用save()方法将更改保存到持久化存储中,因此Core Data可以更新视图。如果仍然无法更新视图,请检查是否在正确的上下文中调用save()方法。
if let subLists = todoItem.sub?.allObjects as? [ToDoSubModel] { ForEach(subLists) { item in Divider() HStack { Image(systemName:item.isChecked ? "checkmark.circle.fill":"circle") .foregroundColor(item.isChecked ? settingsVM.ThemeColors[settingsVM.themeColorNum].color : Color(uiColor: .secondaryLabel)) .onTapGesture { hapticImpact.impactOccurred() item.isChecked.toggle() } Text(item.subTitle ?? "") } } }如何将todoItem.sub的isChecked的值反转
你可以尝试使用 `enumerate()` 方法来获取元素的索引,然后通过索引来修改对应元素的属性值。具体实现可以参考下面的代码:
```swift
if let subLists = todoItem.sub?.allObjects as? [ToDoSubModel] {
ForEach(subLists.indices, id: \.self) { index in
let item = subLists[index]
Divider()
HStack {
Image(systemName: item.isChecked ? "checkmark.circle.fill" : "circle")
.foregroundColor(item.isChecked ? settingsVM.ThemeColors[settingsVM.themeColorNum].color : Color(uiColor: .secondaryLabel))
.onTapGesture {
hapticImpact.impactOccurred()
subLists[index].isChecked.toggle() // 反转 isChecked 值
}
Text(item.subTitle ?? "")
}
}
}
```
这样,在用户点击 `Image` 视图时,就会将对应的 `isChecked` 值反转。注意,由于 `subLists` 是一个常量数组,我们无法直接修改其元素的属性值,因此需要使用索引来修改原始数据源中的元素。
阅读全文