ios - 使用 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)
}
}
}
解决方案
推荐阅读
- c# - 如何使用 C#、Windows 窗体在月历上突出显示 mysql 中的特定日期?
- amazon-web-services - 如何在特定时间自动创建 Redshift 快照并从快照恢复集群?
- numpy - AttributeError:“numpy.ndarray”对象没有属性“dim”
- reactjs - 如何在赋值之前对值进行类型检查?
- c++ - 将 CHW 格式的浮点向量转换为 cv::Mat
- java - GAE 静态资源到期
- sql - SQL查询按修改日期过滤
- vba - 如何通过 PowerPoint VBA 使用动画时间轴可靠地更改矩形的填充颜色
- c# - 无权访问 catch try 中的分配
- augmented-reality - 在 SceneKit 中从 ImageAnchor 播放 3d 音频