我有两个模型,上面设置了@Relationship。这里,Employee可以有很多AttendanceLog,当我添加AttendanceLog with Employee时,它应该也会更新和反映相关的Employee,并更新视图对吗?但它Employee只有在我关闭应用程序并在添加考勤日志后重新打开时才更新。
/**
## Steps to recreate the issue
- Start
- Tap Add Employee in next screen
- Tap first or any employee row item , tap Add Log in next screen, it adds new log and reflacted in same screen
- Go back, the log doesn't reflect in previous screen
- Press back again and start, the log count doesn't update in employee rows.
- Close the app and reopen the app the log count shows up , as it should.
**/
import Foundation
import SwiftUI
import SwiftData
@Model final class Employee {
@Attribute(.unique) var id: Int
var name: String
var registrationDate: Date
@Relationship(deleteRule: .cascade, inverse: \AttendanceLog.employee) var logs: [AttendanceLog] = []
init(id: Int, name: String) {
self.id = id
self.name = name
self.registrationDate = Date()
}
}
@Model final class AttendanceLog {
@Attribute(.unique) var id: UUID = UUID()
var date: Date
var employee: Employee
init(date: Date, employee: Employee) {
self.date = date
self.employee = employee
}
}
@main
struct SwiftDataSampleApp: App {
var sharedModelContainer: ModelContainer = {
let schema = Schema([
Employee.self,
AttendanceLog.self
])
var modelConfiguration = ModelConfiguration(schema: schema, isStoredInMemoryOnly: false)
do {
return try ModelContainer(for: schema, configurations: [modelConfiguration])
} catch {
fatalError("Could not create ModelContainer: \(error)")
}
}()
var body: some Scene {
WindowGroup {
ContentView()
}
.modelContainer(sharedModelContainer)
}
}
struct ContentView: View {
var body: some View {
NavigationStack {
NavigationLink {
EmployeeList()
} label: {
Text("Start")
}
}
}
}
struct EmployeeList: View {
@Environment(\.modelContext) var modelContext
@Query var employees: [Employee]
var body: some View {
List {
ForEach(employees) {
employee in
HStack {
Text("\(employee.logs.count)") // This doesn't get updated
NavigationLink {
LogView(employee:employee)
} label: {
Text(employee.name)
}
}
}
}
.navigationTitle("Employees")
.toolbar {
ToolbarItem(placement: .topBarTrailing) {
Button {
let seed = [
Employee(id: 1, name: "one"),
Employee(id: 2, name: "two"),
Employee(id: 3, name: "three"),
Employee(id: 4, name: "four"),
Employee(id: 5, name: "five")
]
for e in seed {
modelContext.insert(e)
}
try? modelContext.save()
} label: {
Text("Add Employee")
}
}
}
}
}
struct LogView: View {
@Environment(\.modelContext) var modelContext
@Query var logs: [AttendanceLog]
@Bindable var employee: Employee
var body: some View {
List {
ForEach(logs) {
log in
VStack(alignment: .leading) {
Text(log.id.uuidString).font(.caption2)
}
}
}
.navigationTitle("Attendance Logs")
.toolbar {
ToolbarItem(placement: .topBarTrailing) {
Button {
let log = AttendanceLog(date: Date(), employee: employee)
modelContext.insert(log)
try? modelContext.save()
} label: {
Text("Add Log")
}
}
}
}
}
字符串
1条答案
按热度按时间4smxwvx51#
要“修复”这个特殊的问题,请在您的
AttendanceLog
模型中尝试以下操作:字符串
请注意,在
LogView
中,您应该使用ForEach(employee.logs) { log in ...}
来仅显示该员工的logs
。