【发布时间】:2021-08-02 16:35:04
【问题描述】:
所以我有一个 View 和 List 的子视图,它们接受一个对象。这些对象来自我的数据管理器中的数组。
struct ContentView: View {
@ObservedObject var manager = AppConnectivityManager.shared
var body: some View {
List {
ForEach(manager.goals, id: \.id) { goal in
let _ = print("goal in foreach: \(goal.goal.completitionCount) + title: \(goal.goal.title)")
GoalView(goalWrapper:goal)
}.listRowBackground(Color.clear)
}
}
}
这部分运行良好,每次更新管理器对象时都会触发更新。
问题是我的GoalView(goalWrapper:goal) 只在代码第一次运行时更新一次,但是当它应该被刷新时它保持不变。目标视图中的 print("progress: 语句始终打印相同的值,但列表中的打印语句获取更新。我可能会错过这个概念,但我可以将ObservedObject 传递到子视图中,并且当manager 也得到更新时它会得到更新,但事实并非如此。
struct GoalView: View {
@ObservedObject var goalWrapper: GoalWrapper
var body: some View {
let _ = print("progress: \(self.goalWrapper.goal.completitionCount) + daily: \(self.goalWrapper.goal.dailyNotificationCount) + title: \(self.goalWrapper.goal.title)")
ZStack(content: {
GoalAnimationView(goalWrapper: self.goalWrapper).cornerRadius(10)
VStack(alignment: .leading, spacing: nil, content: {
Text(goalWrapper.goal.title).foregroundColor(.black).padding(.leading, 8)
.padding(.trailing, 8)
.padding(.top, 4)
HStack(alignment: .center,content: {
Text("\(goalWrapper.goal.completitionCount)/\(goalWrapper.goal.dailyNotificationCount)").padding(.top, 2).padding(.trailing, 85).padding(.bottom, 6)
Text("\(goalWrapper.goal.completitionCount)").padding(.top, 2).padding(.trailing, 12).padding(.bottom, 12).font(.title)
}).frame(minWidth: 0, maxWidth: .infinity, minHeight: 0,maxHeight: 35,alignment: .trailing).background(Color.clear)
}).listRowPlatterColor(Color.blue).frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, alignment: .leading).cornerRadius(10)
})
}
}
这是GoalWrapper 类
public class GoalWrapper: ObservableObject, Hashable {
public static func == (lhs: GoalWrapper, rhs: GoalWrapper) -> Bool {
return lhs.goal.id == rhs.goal.id
}
public func hash(into hasher: inout Hasher) {
hasher.combine(goal.id)
}
@Published var goal: Goal!
let id: String
init(goal: Goal) {
self.goal = goal
self.id = goal.id
}
}
有什么方法可以将更新传递给列表子视图?我发现其他一些人对列表有问题并将绑定传递给列表中的视图。这是唯一的方法吗?
【问题讨论】:
-
摆脱你的包装,把你的
Goal作为struct传递(我希望它是struct)。
标签: swiftui combine swiftui-list