首页 > 解决方案 > 使用 SwiftUI 返回 NavigationView 时无法刷新视图

问题描述

我有显示部门对象详细信息的导航视图。在部门内,有几个小组,每个小组内都有许多小组。所有这些不同的对象都使用导航视图在它们自己的视图中。我有一个视图模型,它发布在视图中观察到的更改。我遇到的问题是,当我用一组新成员更新团队时,当我回去查看更新是否反映在组视图中时,我看不到它们。我需要再上一层到部门视图并进入组视图以查看更改。基本上,当再上一级并返回组视图时会触发刷新。我认为在更新团队成员时更新组视图会自动触发视图刷新。我可以看到调试器中的值已更改,但视图未刷新。我错过了什么。任何帮助是极大的赞赏。

以下是代码的相关部分:

部门模型

class Department: Object {
    let groups = List<Group>()
    @objc dynamic var name: String? = "department"
    @objc dynamic var employees: Int = 0
    @objc dynamic var availableHours: Double = 0.0
    
    @objc private dynamic var id = UUID().uuidString

    override static func primaryKey() -> String? {
        return "id"
    }
    
    convenience init(name: String) {
        self.init()
        self.name = name
        self.employees = groups.map(\.employees).reduce(0, +)
        self.availableHours = groups.map(\.availableHours).reduce(0, +)
    }
    
    func update() {
        self.employees = groups.map({$0.employees}).reduce(0, +)
        self.availableHours = groups.map(\.availableHours).reduce(0, +)
    }
}

组模型类。组将部门作为父级,将团队作为子级

class Group: Object, Identifiable {
    let teams = List<Team>()
    @objc dynamic var department: Department?
    @objc dynamic var name: String? = "group"
    @objc dynamic var employees: Int = 0
    @objc dynamic var availableHours: Double = 0
    
    @objc dynamic var id = UUID().uuidString

    override static func primaryKey() -> String? {
        return "id"
    }
    
    convenience init(department: Department, name: String) {
        self.init()
        self.department = department
        self.name = name
        
        self.employees = teams.map({$0.size}).reduce(0, +)
        self.availableHours = teams.map(\.hoursAvailable).reduce(0, +)
    }
    
    func update() {
        self.employees = teams.map({$0.size}).reduce(0, +)
        self.availableHours = teams.map(\.hoursAvailable).reduce(0, +)
        department?.update()
    }
    
    func addTeam(team: Team) {
        teams.append(team)
        department?.update()
    }
}

团队课

class Team: Object, Identifiable {
    @objc dynamic var name: String? = "team"
    @objc dynamic var group: Group?
    @objc dynamic var size: Int = 0
    @objc dynamic var hoursAvailable: Double = 0
    @objc dynamic var id = UUID().uuidString

    override static func primaryKey() -> String? {
        return "id"
    }
    
    convenience init(group: Group, name: String, size: Int) {
        self.init()
        self.group = group
        self.name = name
        self.size = size
        self.hoursAvailable = Double(size) * 8.0
    }
    
    func addMembers(size: Int) {
        self.size += size
        hoursAvailable += 8.0 * Double(size)
        group?.update()
    }
}

观点:

struct DepartmentView: View {
    var department: Department?
    var body: some View {
        NavigationView {
            VStack {
                HStack {
                    Text("Total Employees")
                    Spacer()
                    Text("\(department!.employees)")
                }
                HStack {
                    Text("Total Groups")
                    Spacer()
                    Text("\(department!.groups.count)")
                }
                HStack {
                    Text("Total Hours")
                    Spacer()
                    Text("\(department!.availableHours)")
                }
                
                ForEach(department!.groups) { g in
                    NavigationLink(destination: GroupView(groupvm: GroupVM(group: g))) {
                        HStack {
                            Text("Employees")
                            Spacer()
                            Text("\(g.employees)")
                        }
                        HStack {
                            Text("Available Hours")
                            Spacer()
                            Text("\(g.availableHours)")
                        }
                        HStack {
                            Text("Teams")
                            Spacer()
                            Text("\(g.teams.count)")
                        }
                    }
                    Divider()
                }

            }
            .navigationBarTitle(department!.name!)
        }
    }
}

团队视图模型

class TeamVM: ObservableObject {
    @Published var teamdb: Team
    
    init(team: Team) {
        self.teamdb = team
    }
    
    var team: Team {
        teamdb
    }
    
    func updateMembers(size: Int) {
        do {
            let realm = try Realm()
            try realm.write() {
                teamdb.addMembers(size: size)
            }
        } catch {
            print(error.localizedDescription)
        }
    }
}

标签: iosswiftuiswift5

解决方案


推荐阅读