swift 插入不按要求更新视图

piah890a  于 5个月前  发布在  Swift
关注(0)|答案(1)|浏览(62)

我有两个模型,上面设置了@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")
                }
            }
        }
    }
}

字符串

4smxwvx5

4smxwvx51#

要“修复”这个特殊的问题,请在您的AttendanceLog模型中尝试以下操作:

@Relationship var employee: Employee?  // <--- here

字符串
请注意,在LogView中,您应该使用ForEach(employee.logs) { log in ...}来仅显示该员工的logs

相关问题