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] = []
}