Vytvořil jsem vlastní prvek volám Slide
. Mám LazyVGrid
že je zobrazení moje Slide
prvky. Můj problém je, že když jsem aktualizovat data pole, že moje síť je pomocí, Slide
prvky nejsou aktualizace.
Scénář:
Uživatel klikne na tlačítko možnosti na Slide
a změny Slide
barvu jsem pak aktualizaci dat pole ale Slide
prvek nebude aktualizovat přes data je správné (mám ověřeno to přidáním Text(slide.color)
do LazyVGrid
které zobrazuje nově nastavit barvu, jak se očekávalo)
Mé Podezření:
Já jsem za předpokladu, že to nebude aktualizovat, protože mám něco špatně v Slide
struct, jsem docela nový SwiftUI takže se učím, jak jsem jít. Musím také zmínit, že tento načte a zobrazí správně, když jsem se poprvé zobrazí pohled, jediný problém je, že to nemusí aktualizovat, když jsem se aktualizovat SlideStructure
.
Zde je Kód:
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)
}
}
Zde je Snímek Souboru, který také ukazuje, jak jsem nastavení barev pro snímky:
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] = []
}