添加新项目时 SwiftUI 列表不会更新

时间:2021-01-22 10:37:57

标签: swift swiftui

我有两列嵌套数据(父/子)。第一列中的每个项目都是父项。选择任何人时,它会在第二列中显示其子作为列表。

问题是当使用顶部的添加/更新按钮在父列表中添加数据时,它会立即刷新第一列 GUI 并显示更新的数据。

当使用子添加/更新按钮在第二列中添加数据时,它不会立即刷新第二列 GUI。直到我再次从第一列中选​​择父项,然后它才会显示更新的数据。

这是我的代码和 GUI 屏幕截图

struct STClip: Identifiable, Hashable {
    
    var uid = UUID()
    var id :String
    var itemType:String?         // History or achive clips
    var clipTitle: String?       // Clip title
    var creationDate: Date?      // Clip Creation date
    var clipAttr:NSAttributedString?
}

struct STClipset: Identifiable, Hashable {
    
    var id = UUID()
    var clipsetName :String
    var isEditAble:Bool

    init( clipsetName:String, isEditAble:Bool){
        self.clipsetName = clipsetName
        self.isEditAble = isEditAble
    }
}

struct STClipItem: Identifiable, Hashable {
    var id = UUID()
    var clipsetObject: STClipset
    var clipObjects: [STClip]
}

class DictModel: ObservableObject {
    @Published var dict:[STClipItem] = []
    
    @Published var selectedItem: STClipItem? {
        didSet {
            if self.selectedItem != nil {
                //print("setitem did set is called")
                
                //if ( self.selectedItem?.clipObjects.count ?? 0 > 0) {
                  //  selectedItemClip = self.selectedItem?.clipObjects[0]
                //}
            }
        }
    }
    
    @Published var selectedItemClip: STClip? {
        didSet {
            if self.selectedItemClip != nil {
                //self.load(id: self.selectedItem!.itemId)
                //print("clipitem did set is called")
            }
        }
    }
}

struct TestPublishedDidSet: View {
    @ObservedObject var vm = DictModel()
    @State var selected:STClipItem? = nil
    @State var selectedClip:STClip? = nil
    @State var clipText = NSAttributedString(string: "Enter your text")
    
    var body: some View {
        VStack {
            //Button
            HStack{
                //Clipset button
                VStack{
                    Text("Add Parent data")
                        .padding(10)
                    
                    Button("Add") {
                        let clipset1 = STClipset(clipsetName: "Example clipset\(self.vm.dict.count)", isEditAble: false)
                        var clip1 = STClip(id: "0", itemType: "", clipTitle: "Clip 1")
                        clip1.clipAttr = NSAttributedString(string: clip1.clipTitle!)
                        clip1.creationDate = Date()
                        var clip2 = STClip(id: "1", itemType: "", clipTitle: "Clip 2")
                        clip2.clipAttr = NSAttributedString(string: clip2.clipTitle!)
                        clip2.creationDate = Date()
                        
                        let item = STClipItem(clipsetObject: clipset1, clipObjects: [clip1, clip2] )
                        self.vm.dict.append(item)
                    }
                    
                    Button("Update") {
                        let index = self.vm.dict.count - 1
                        self.vm.dict[index].clipsetObject.clipsetName = "Modifying"
                    }
                }
                
                Divider()
                //Clip button
                VStack{
                    Text("Add Child data")
                    .padding(10)
                    
                    Button("Add") {
                        
                        let object = self.vm.dict.firstIndex(of: self.vm.selectedItem!)
                        if( object != nil){
                            
                            let index = self.vm.selectedItem?.clipObjects.count
                            var clip1 = STClip(id: "\(index)", itemType: "", clipTitle: "Clip  \(index)")
                            clip1.clipAttr = NSAttributedString(string: clip1.clipTitle!)
                            clip1.creationDate = Date()
                            self.vm.dict[object!].clipObjects.append(clip1)
                        }
                    }
                    
                    Button("Update") {
                        let index = (self.vm.selectedItem?.clipObjects.count)! - 1
                        
                        self.vm.selectedItem?.clipObjects[index].clipAttr = NSAttributedString(string:"Modifying")
                        
                    }
                }
            }.frame(height: 100)
            
           
            //
            Divider()
            NavigationView{
                HStack{
                    
                    //Clipset list
                    List(selection: self.$vm.selectedItem){
                        ForEach(Array(self.vm.dict), id: \.self) { key in
                            Text("\(key.clipsetObject.clipsetName)...")
                        }
                    }
                    .frame(width:200)
                    .listStyle(SidebarListStyle())
                    
                    Divider()
                    VStack{
                        //Clip list
                        if(self.vm.selectedItem?.clipObjects.count ?? 0 > 0){
                            List(selection: self.$vm.selectedItemClip){
                                ForEach(self.vm.selectedItem!.clipObjects, id: \.self) { key in
                                    Text("\(key.clipTitle!)...")
                                }
                            }
                            .frame(minWidth:200)
                        }
                    }
                }
            }
        }
    }
}

截图如下:

enter image description here

1 个答案:

答案 0 :(得分:0)

我不知道这是错误还是其他什么。 这些问题可以通过将对象重新分配给所选项目来解决。

if( object != nil){
    
    let index = self.vm.selectedItem?.clipObjects.count
    var clip1 = STClip(id: "\(index)", itemType: "", clipTitle: "Clip  \(index)")
    clip1.clipAttr = NSAttributedString(string: clip1.clipTitle!)
    clip1.creationDate = Date()
    self.vm.dict[object!].clipObjects.append(clip1)
    self.vm.selectedItem = self.vm.dict[object!] //<<-- Here
}