Lazyvgrid'de güncellenmeyen özel UI Öğeleri

0

Soru

Aradığım özel bir öğe oluşturdum Slide. Benim var LazyVGrid bu görüntüleme benim Slide öğeler. Izgara kullanarak bir veri dizisi update ettiğim zaman, bu sorun benim Slide öğeler güncellenmiyor.

Senaryo: Kullanıcı a üzerindeki seçenekler düğmesine tıklar. Slide ve değiştirir Slide renk, daha sonra veri dizisini güncelliyorum ama Slide veriler doğru olmasına rağmen öğe güncellenmiyor (bunu ekleyerek doğruladım Text(slide.color) içine LazyVGrid yeni ayarlanan rengi beklendiği gibi görüntüler)

Şüphelerim: Güncellemediğini varsayıyorum çünkü yanlış bir şeyim var. Slide struct, SwiftUİ için oldukça yeniyim, bu yüzden ilerledikçe öğreniyorum. Görünümü ilk görüntülediğimde bunun doğru yüklendiğini ve görüntülendiğini de belirtmeliyim, tek sorun, görünümü güncellediğimde güncellenmemesidir. SlideStructure.

İşte Kod:

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)
    }
}

İşte slaytların renklerini nasıl ayarladığımı da gösteren Slayt Dosyası:

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

En iyi cevabı

0

Herhangi bir çözümü test edebilmek için çok fazla eksik parça var, bu yüzden bir tahminde bulunacağım. İçinde ShowSongFile deneyebilirsiniz :

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
    }
            
            

ve ayarlayın Slide buna göre, yani, kaldır IsSelected ve .background(IsSelected ? Color.accentColor : .black).

P. S: değişkenlerinizin ve işlevlerinizin adlandırılması ve durumu kodunuzu çekici olmaktan daha az okumak.

2021-11-23 04:33:26

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................