首页 > 解决方案 > 将数据数组传递到另一个数据数组

问题描述

一个星期以来,我无法弄清楚如何将我的数据传递到另一个特定的数据数组中。我是 swift 的初学者,我需要你的帮助,我的 Hymn 应用程序是基于我的母语的。

首先,我有一个名为 Lyric 的结构数组,例如...

import SwiftUI

struct Lyric: Identifiable {

    let id = UUID()
    let number: Int
    var zoTitle: String
    let engTitle: String
    let key: String
    let musicStyle: String
    let verse1: String
    var verse2: String?
    var verse3: String?
    var verse4: String?
    var verse5: String?
    var preChorus: String?
    var chorus: String?
    var bridge: String?
    
}

public struct LyricList {
    
    static var hymnLa = [
    Lyric(number: 1,
        zoTitle: "Pasian Phatna",
        engTitle: "Praise God, from whom All Blessings Flow",
        key: "Key: G",
        musicStyle: "",
        verse1: "Thupha kheempeuh hong pia Pasian \nPhat un, leitung mi khempeuh aw, \nPhat un vantung mi honpi'n zong; \nPhat un Pa, Ta le Kha Siangtho."),
        
    Lyric(number: 2,
        zoTitle: "Itna Kumpi, Ka Tuu-Cing Pa",
        engTitle: "The King of Love My Shephaerd Is (Dominus Regit Me)",
        key: "Key: G",
        musicStyle: "",
        verse1: "Itna Kumpi, ka tuu-cing pa, \nAma hoih na sia ngei lo, \nA mi suak leng sapna om lo, \nTawntung Ama mi hi ta.",
        verse2: "Nuntakna tui a luanna ah, \nTat khiatsa ka kha tonpih, \nLo no naah hong paipih hi, \nVantung an tawh hong vaak hi.",
        verse3: "Khuamial sihna kuam sung lau lo, \nKei kiang Topa Na om hi, \nKa lung nuam sak, Na ciangkhut in, \nLam hong hilh singlamteh in.",
        verse4: "Ni sim tawntung kizom sual in, \nNa hoihna kipelh ngei lo, \nTuucing siampa, Nang kong phat hi, \nTawntung nangma innpi sung Amen."
        ), //... you get the idea

在这里,我有另一个名为 HymnLyrics 的结构,它显示了我所有的赞美诗歌曲。

import SwiftUI

struct HymnLyrics: View {
    
    var lyrics: [Lyric] = LyricList.hymnLa
    @AppStorage("fontSizeIndex") var fontSizeIndex = Int("Medium") ?? 18
    @AppStorage("fontIndex") var fontIndex: String = ""
    @AppStorage("showHVNumbers") var showHVNumbers: Bool = true
    
    var body: some View {
        List(lyrics, id: \.id) { lyric in
            
            VStack(alignment: .center, spacing: 0) {
                
                Text("\(lyric.number)")
                    .padding()
                    .multilineTextAlignment(/*@START_MENU_TOKEN@*/.leading/*@END_MENU_TOKEN@*/)
                    
                
                VStack {
                    VStack {
                        Text(lyric.zoTitle)
                            .font(.title2)
                            .fontWeight(.bold)
                            .foregroundColor(.primary)
                            .autocapitalization(.allCharacters)
                        
                        Text(lyric.engTitle)
                            .font(.title3)
                            .fontWeight(.medium)
                            .foregroundColor(.secondary)
                            .italic()
                            
                    }
                    // Don't use Padding here!
                    
                }
                .multilineTextAlignment(.center)
                
                HStack {
                    Text(lyric.key)
                        .italic()
                    
                    Spacer()
                    
                    Text(lyric.musicStyle)
                }
                .foregroundColor(.blue)
                .padding(.vertical)
                
                
                Group {
                    HStack {
                        if showHVNumbers {
                            Image(systemName: "1.circle.fill")
                                .font(.title2)
                                .foregroundColor(.red)
                        }
                        
                        Text(lyric.verse1)
                            .font(Font.custom(fontIndex, size: CGFloat(fontSizeIndex)))
                        Spacer()
                    }
                    
                    if (lyric.chorus != nil) {
                        
                        if showHVNumbers {
                            HStack {
                                Image(systemName: "arrowshape.turn.up.right.circle.fill")
                                    .font(.title2)
                                    .foregroundColor(.red)
                                    .padding(.trailing)
                                
                                Text(lyric.chorus ?? "")
                                    .font(Font.custom(fontIndex, size: CGFloat(fontSizeIndex)))
                                
                                Spacer()
                            }
                            
                        } else {
                            HStack {
                                Text(lyric.chorus ?? "")
                                    .font(Font.custom(fontIndex, size: CGFloat(fontSizeIndex)))
                                    .padding(.leading)
                                Spacer()
                            }   
                        }
                    }
                    
                    if (lyric.verse2 != nil) {
                        HStack {
                            if showHVNumbers {
                                Image(systemName: "2.circle.fill")
                                    .font(.title2)
                                    .foregroundColor(.red)
                            }
                            
                            Text(lyric.verse2 ?? "")
                                .font(Font.custom(fontIndex, size: CGFloat(fontSizeIndex)))
                            Spacer()
                        }
                    }
                    
                    if (lyric.verse3 != nil) {
                        HStack {
                            if showHVNumbers {
                                Image(systemName: "3.circle.fill")
                                    .font(.title2)
                                    .foregroundColor(.red)
                            }
                            
                            Text(lyric.verse3 ?? "")
                                .font(Font.custom(fontIndex, size: CGFloat(fontSizeIndex)))
                            Spacer()
                        }
                    }
                    
                    if (lyric.verse4 != nil) {
                        HStack {
                            if showHVNumbers {
                                Image(systemName: "4.circle.fill")
                                    .font(.title2)
                                    .foregroundColor(.red)
                            }
                            
                            Text(lyric.verse4 ?? "")
                                .font(Font.custom(fontIndex, size: CGFloat(fontSizeIndex)))
                            Spacer()
                        }
                    }
                    
                    if (lyric.verse5 != nil) {
                        HStack {
                            if showHVNumbers {
                                Image(systemName: "5.circle.fill")
                                    .font(.title2)
                                    .foregroundColor(.red)
                            }
                            
                            Text(lyric.verse5 ?? "")
                                .font(Font.custom(fontIndex, size: CGFloat(fontSizeIndex)))
                            Spacer()
                        }
                    }
                    
                }
                .padding(.bottom)
                
            }
        }
    }
}

struct HymnLyrics_Previews: PreviewProvider {
    static var previews: some View {
        HymnLyrics()
    }
}

我还为歌曲标题创建了一个结构,它将对所有歌曲标题进行代数排序。Titles 是 ContentView 的一部分,所以我将忽略它。在我的 HymnTitles 结构中,我创建了一个分段选取器样式,它将显示 Zolai Title、English Title 和 Keys。

import SwiftUI

struct HymnTitles: View {
    @Binding var isPresented: Bool
    
    @State private var selectedHymn: SideOfLanguages = .zoLAI
    
    init(isPresented: Binding<Bool>) {
        self._isPresented = isPresented // Note: this is the trick
        UISegmentedControl.appearance().selectedSegmentTintColor = .systemRed
        UISegmentedControl.appearance().setTitleTextAttributes(
            [
                .foregroundColor : UIColor.black,
                .font: UIFont.systemFont(ofSize: 18)
            ], for: .selected)
    }
    
    var body: some View {
        NavigationView {
            
            ZStack {
                Color("bColor").edgesIgnoringSafeArea(.all)
                
                VStack(spacing: 0) {
                    Picker("", selection: $selectedHymn) {
                        ForEach(SideOfLanguages.allCases, id: \.self) {
                            Text($0.rawValue)
                        }
                        
                    }
                    .pickerStyle(SegmentedPickerStyle())
                    .padding(.all)
                    .padding(.horizontal, 20.0)
                    
                    //Spacer()
                    ChosenLanguages(selectedLanguages: selectedHymn)
                    //Spacer()
                }
                .navigationBarTitle(Text("Titles"), displayMode: .inline)
                .toolbar {
                        Button(action: {
                            
                            self.isPresented = false
                        
                        }, label: {
                            Text("Cancel")
                                .fontWeight(.bold)
                            
                        })
                }
                
                
            }
            
            
        }
    }
}


struct HymnTitles_Previews: PreviewProvider {
    static var previews: some View {
        HymnTitles(isPresented: .constant(false))
            
            
    }
}


enum SideOfLanguages: String, CaseIterable {
    case zoLAI = "Zolai Titles"
    case engLISH = "English Titles"
    case keyS = "Keys"
}


struct ChosenLanguages: View {
    
    //@State var selectedNumbers: Int
    var selectedLanguages: SideOfLanguages
    
    var body: some View {
        switch selectedLanguages {
        case .zoLAI:
            ZolaiTitles()
        case .engLISH:
            EnglishTitles()
        case .keyS:
            Keys()
        }
    }
}

这是我的困惑开始......当我点击 ZolaiTitles 结构上的歌曲标题时,我想更改并显示 HymnLyrics 结构上的点击歌曲。换句话说,我想在屏幕中间显示确切的歌曲,因为列表是可滚动的。我尝试了许多不同的方法,但都没有成功。ZolaiTitles 结构如下...

struct ZolaiTitles: View {
    
    //@Binding var selectedZoTitle: Int
    @EnvironmentObject var tappingSwitches: TapToggle
    @AppStorage("fontSizeIndex") var fontSizeIndex = Int("Medium") ?? 18
    @AppStorage("fontIndex") var fontIndex: String = ""
    
    let zoLyrics: [Lyric] = LyricList.hymnLa.sorted { lhs, rhs in
        return lhs.zoTitle < rhs.zoTitle
    }
    
    var body: some View {
        
        ScrollView {
            ForEach(zoLyrics, id: \.id) { zoLyric in
                VStack {
                    HStack {
                        Text(zoLyric.zoTitle)
                            .font(Font.custom(fontIndex, size: CGFloat(fontSizeIndex)))
                            .foregroundColor(Color("bTextColor"))
                            .lineLimit(1)
                            .minimumScaleFactor(0.5)

                        Spacer()
                        Text("\(zoLyric.number)")
                            .font(Font.custom(fontIndex, size: CGFloat(fontSizeIndex)))
                            .foregroundColor(Color("bTextColor"))
                    }
                    .onTapGesture(perform: {
                        self.tappingSwitches.isHymnTapped.toggle()
                        //self.selectedZoTitle = zoLyric.number
                        //HymnLyrics(lyrics: LyricList.hymnLa)
                        
                    })
                        
                    
                }
                .frame(maxWidth: .infinity, alignment: .leading)
                .padding([.leading, .bottom, .trailing])
            }
        }
    }
}

标签: swiftui

解决方案


推荐阅读