在SwiftUI中为树结构更新UI

问题描述

我有一个ObservableObject类Model0,它有一个Published对象nestednested对象表示递归树结构。我希望能够更新树结构并适当更新UI。但是,在下面的代码中,当我更新nested对象的子代时,UI不会更新,我认为是因为对nested的引用未更改。每当我更改树结构中的任何nested对象时,如何更新UI?

class nested: Identifiable {
    var id: UUID = UUID()
    var name: String
    var children:[nested]
    
    init(name: String,children:[nested]) {
        self.children = children
        self.name = name
    }
}

class Model0 : ObservableObject {
    @Published var nested: nested
    
    init(nested: nested) {
        self.nested = nested
    }
    
    func update() {
        nested.children[0] = nested(name:"New",children: [])
    }
}

struct nestedView: View {
    var nested: nested
    
    var body: some View {
        vstack {
            Text(nested.name)
            
            ForEach(nested.children) { c in
                nestedView(nested: c)
            }
        }
    }
}


struct Test: View {
    @Observedobject var model: Model0 = Model0(nested: nested(name: "Parent",children: [nested(name: "Child",children: [])]))
    
    var body: some View {
        vstack {
            Button(action: {
                self.model.update()
            }) {
             Text("Update")
            }
            nestedView(nested: model.nested)
        }
    }
}

解决方法

如果您决定创建引用类型的模型,则需要使所有模型都可观察,因此每个级别都可以更新相应的视图。而且,当然,每个级别模型都有单独的视图。

考虑到以上,这是一个解决方案。在Xcode 12 / iOS 14上进行了测试。

仅修改部分:

private void calculate_dtos(double x)
    {
  
        int start_index = (int)Math.Log(x,60);
        double x_buffer = x;
        List<int> q = new List<int>();

        while (x_buffer!= 0.0000000)
        {
            int xx = (int)(x_buffer / Math.Pow(60,start_index));
            q.Add(xx);
            x_buffer -= xx * Math.Pow(60,start_index);
            start_index--;
        }
    }