कस्टम यूआई तत्वों अद्यतन नहीं में LazyVGrid

0

सवाल

मैं बनाया एक कस्टम तत्व मैं फोन कर रहा हूँ Slide. मैं एक LazyVGrid कि प्रदर्शित कर रहा है मेरे Slide तत्वों. मेरा मुद्दा यह है कि जब मैं अद्यतन डेटा सरणी है कि अपने ग्रिड का उपयोग कर रहा है, के Slide तत्वों अद्यतन नहीं कर रहे हैं.

परिदृश्य: उपयोगकर्ता पर क्लिक करता है, विकल्प बटन पर एक Slide और परिवर्तन के Slide रंग, मैं हूँ तो अद्यतन करने के डेटा सरणी लेकिन Slide तत्व अद्यतन नहीं करता है के बावजूद किया जा रहा डेटा सही (मैं सत्यापित किया है इस को जोड़ने के द्वारा Text(slide.color) में LazyVGrid प्रदर्शित करता है जो नव सेट रंग उम्मीद के रूप में)

मेरा शक: मैं मान रहा हूँ यह अद्यतन नहीं करता है, क्योंकि मैंने कुछ गलत किया है, में Slide संरचना, मैं काफी हूँ के लिए नए SwiftUI तो मैं सीख रहा हूँ के रूप में मैं जाने के लिए. मैं यह भी उल्लेख करना आवश्यक है कि इस भार को प्रदर्शित करता है और सही ढंग से जब मैं पहली बार प्रदर्शन को देखने के लिए, केवल समस्या यह है कि अद्यतन नहीं करता है, जब मैं अद्यतन SlideStructure.

यहाँ कोड है:

struct ShowSongFile : View {
@EnvironmentObject var SlideStructure : SlidesModel
@State var selectedSlide : SplaySlide? = nil
var columns = [GridItem(.adaptive(minimum: 320))]
var body: some View {
    ScrollView {
        LazyVGrid(columns: columns, alignment: .trailing, spacing: 20) {
            ForEach(SlideStructure.SongSlides, id:\.id) { slide in
                if slide.id == selectedSlide?.id {
                    Slide(IsSelected:true, SlideData: slide)
                 
                } else {
                    Slide(IsSelected:false, SlideData: slide)
                        .onTapGesture {
                            selectSlide(Slide: slide)
                        }
                }
            }
        }.onAppear(perform: loadSelectedFile)
    }
}

यहाँ स्लाइड फ़ाइल जो भी दिखाता है कि कैसे मैं स्थापित कर रहा हूँ रंग के लिए स्लाइड:

struct Slide : View {
@State var EnableSlideEditing : Bool? = false
@State var IsSelected : Bool = false
@State var SlideData : SplaySlide
@EnvironmentObject var SlideStructure : SlidesModel

var body : some View {
    VStack {
        Group{
            VStack(alignment: .center) {
                let editor = TextEditor(text: $SlideData.lyric)
                    .multilineTextAlignment(.center)
                    .padding()
                let text = Text(SlideData.lyric)
                    .multilineTextAlignment(.center)
                    .frame(width: 320.0, height: 160.0)
                if EnableSlideEditing ?? false {
                    editor
                } else {
                    text
                }
                
                Group {
                    HStack {
                        Text(SlideData.slideType)
                            .padding(.leading, 5.0)
                        Spacer()
                        MenuButton(label: Image(systemName: "ellipsis.circle")) {
                            Button("Edit Slide Text", action: {EnableSlideEditing?.toggle()})
                            Divider()
                            Menu("Slide Type") {
                                Button("Verse", action: {SlideType(Type: "Verse", ColorHex: "#f57242")})
                                Button("Chorus", action: {SlideType(Type: "Chorus", ColorHex: "#0068bd")})
                                Button("Pre-Chorus", action: {SlideType(Type: "Pre-Chorus", ColorHex: "#02ad96")})
                                Button("Tag", action: {SlideType(Type: "Tag", ColorHex: "#ad027d")})
                                Button("Bridge", action: {SlideType(Type: "Bridge", ColorHex: "#02ad96")})
                            }
                            Menu("Transitions") {
                                Button("Option 1", action: {})
                                Button("Option 2", action: {})
                            }
                            Divider()
                            Button("Delete Slide", action: {})
                            Button("Duplicate Slide", action: {})
                        }
                        .menuButtonStyle(BorderlessButtonMenuButtonStyle())
                        .frame(alignment: .trailing)
                        .padding(.trailing, 5.0)
                        .buttonStyle(PlainButtonStyle())
                    }
                }
                .frame(width: 320, height: 20, alignment: .leading)
                .background(Color.init(hex: SlideData.slideBorderColorHex))
            }
        }
        .frame(width: 320, height: 180, alignment: .bottomLeading)
        .background(IsSelected ? Color.accentColor : .black)
        .cornerRadius(10)
    }
}

func SlideType(Type:String, ColorHex: String) {
    for (index, slide) in SlideStructure.SongSlides.enumerated() {
        if slide.id == self.SlideData.id {
            SlideStructure.SongSlides[index].slideBorderColorHex = ColorHex
            SlideStructure.SongSlides[index].slideType = Type
            ShowSongFile.main?.SongFile.slides = SlideStructure.SongSlides
            ShowSongFile.main!.SongFile.SaveSongToDisk()
          }
      }
   }
}

SlideStructure: (SlideModel)

class SlidesModel : ObservableObject {
@Published var SongSlides : [SplaySlide] = []
}
swiftui
2021-11-23 03:59:03
1

सबसे अच्छा जवाब

0

वहाँ रहे हैं भी कई लापता भागों के लिए सक्षम हो सकता है परीक्षण करने के लिए किसी भी विशेष रूप से समाधान है, तो मैं ले जाएगा लगता है. में ShowSongFile तुम कोशिश कर सकते हो :

LazyVGrid(columns: columns, alignment: .trailing, spacing: 20) {
    ForEach(SlideStructure.SongSlides, id:\.id) { slide in
        Slide(SlideData: slide)  // <--- here
            .onTapGesture {
                selectSlide(Slide: slide)
            }
            .background(slide.id == selectedSlide?.id ? Color.accentColor : .black)  // <--- here
    }
            
            

और समायोजित Slide तदनुसार, कि है, को दूर IsSelected और .background(IsSelected ? Color.accentColor : .black).

P. S: अपने नामकरण और मामले की अपने चर और कार्यों के लिए बनाता है अपने कोड को पढ़ने के कम से कम अपील कर रही है ।

2021-11-23 04:33:26

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................