我有两列嵌套数据(父/子)。第一列中的每个项目都是父项。选择任何人时,它会在第二列中显示其子作为列表。
问题是当使用顶部的添加/更新按钮在父列表中添加数据时,它会立即刷新第一列 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)
}
}
}
}
}
}
}
截图如下:
答案 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
}