swiftui - 将数据数组传递到另一个数据数组
问题描述
一个星期以来,我无法弄清楚如何将我的数据传递到另一个特定的数据数组中。我是 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])
}
}
}
}
解决方案
推荐阅读
- javascript - CSS 样式在刷新后显示,然后在 Knockout 中不可见
- angular - 未捕获的类型错误:无法在 HttpXhrBackend 读取未定义的属性“方法”
- node.js - 使用nodejs将http重定向到https时出现ERR_CONNECTION_REFUSED
- azure - 将 .azurewebsites.net 重定向到 MVC.Core 的域
- node.js - 允许用户链接他们的谷歌驱动器来存储数据
- php - 在 Codeigniter 中上传的最大文件大小
- javascript - 用于在 JavaScript 中显示现有动态表中的行数据以及添加删除的 JSON 对象
- sql - Sql/Pl/sql 中的字符串模式匹配
- c++ - C++11:unordered_map/set 是否保证遍历顺序为插入顺序?
- javascript - javascript中的最佳算法分组数据