我有一个具有嵌套对象结构的项目
Project -> Panels -> Layers
我有 SettingsView,可以在其中更新任何这些结构的不同属性。
每次更新时,我都必须调用
objectWillChange.send()
才能立即查看视图中的更改。
如果我有少量对象,它可以正常工作并且不会产生性能问题。但如果对象数量增加,就会产生性能问题。
我的代码示例如下:
class SelectedProjectHolder: ObservableObject {
@Published var projects: [Project] = []
@Published var selectedProject: Project? = nil
.....
func updateTextLayerColor(for textLayer: TextLayer, newColor: Color) {
guard let selectedProject = selectedProject else {
return
}
for (panelIndex, panel) in selectedProject.panels.enumerated() {
if let layerIndex = panel.textLayers.firstIndex(where: { $0.id == textLayer.id }) {
selectedProject.panels[panelIndex].textLayers[layerIndex].color = newColor
objectWillChange.send()
return
}
}
}
....
}
struct MainApp: App {
let selectedProjectHolder = SelectedProjectHolder()
var body: some Scene {
WindowGroup {
ContentView(lastSaveTime: lastSaveTime)
.environmentObject(selectedProjectHolder)
}
.commands {
SidebarCommands()
}
}
}
我错过了什么以及为什么在不明确调用
objectWillChange.send()
的情况下它不起作用?
有没有一种方法可以立即查看更改,而无需在每次对
objectWillChange.send()
的 selectedProject
属性进行更改时调用 SelectedProjectHolder
?
代码结构不正确。该对象应该只保存项目并负责加载和保存。所选项目应在 ProjectsView 中为
@State
。或者在公共父级中声明 @Binding 传递给可以更改选择的子视图,并作为 let 传递给仅读取当前选择的子视图。