В моем коде есть два режима выбора. Первое окно выбора выбирает содержимое второго. Но проблема в том, что когда я пытаюсь выбрать любое значение из второго окна выбора, оно возвращается к первому элементу.
Видео: https://media.giphy.com/media/kE26SOMYft2SHUhx2A/giphy.gif
Код:
struct ContentView: View {
@ObservedObject var viewModel = VerseViewModel()
var body: some View {
VStack {
HStack(spacing: 0) {
Picker(selection: self.$viewModel.selectedFrameworkIndex, label: Text("")) {
ForEach(0 ..< viewModel.Categories.count) {
Text(self.viewModel.Categories[$0])
}
}
.frame(width: 160)
.clipped()
Spacer()
Picker(selection: self.$viewModel.selectedFrameworkIndex1, label: Text("")) {
ForEach(viewModel.verseModels, id: \.id) {data in
Text(data.Verse)
}
}
.id(viewModel.id)
.frame(width: 200)
.clipped()
}
Spacer()
}
}
}
ViewModel:
class VerseViewModel: ObservableObject {
private var verseSelection: [Int: Int] = [:]
var verseData: BibleVerses = load("BibleVerses.json")
// @Published var topic: String = ""
@Published var id: UUID = UUID()
@Published var selectedFrameworkIndex: Int = 0 {
didSet {
verseModels = getVerse(Verse: Categories[selectedFrameworkIndex])
id = UUID()
print("I am changing it\(selectedFrameworkIndex)")
}
}
@Published var Categories: [String] = []
@Published var selectedFrameworkIndex1: Int = 0 {
willSet {
DispatchQueue.main.async { [newValue] in
print("verse changed", newValue)
self.verseSelection[self.selectedFrameworkIndex1] = newValue
}
}
}
@Published var verseModels: [verseModelData] = []
init() {
self.Categories = verseTopics()
}
func verseTopics() -> [String] {
var verseTopicData: [String] = []
for (key, value) in self.verseData {
verseTopicData.append(key)
}
verseTopicData.sort()
return verseTopicData
}
func getVerse(Verse: String) -> [verseModelData] {
guard let data = self.verseData[Verse] else { return [] }
var finalData: [verseModelData] = []
for each in data {
finalData.append(verseModelData(Verse: each.Verse))
}
return finalData
}
}
struct verseModelData: Identifiable {
let id = UUID()
let Verse: String
init(Verse: String) {
self.Verse = Verse
}
}
ПРИМЕЧАНИЕ : нет проблем с анализом данных, использующим другой метод, и образец json приведен ниже
JSON:
{
"Children": [
{
"Verse": "Proverbs 22:6"
},
{
"Verse": "Ephesians 6:1-4"
},
{
"Verse": "Proverbs 17:6"
},
{
"Verse": "Matthew 19:13-15"
},
{
"Verse": "Psalm 127:3"
},
{
"Verse": "Matthew 18:4"
},
{
"Verse": "Psalm 139:13-14"
},
{
"Verse": "1 Peter 5:5"
}
],
"Christmas": [
{
"Verse": "Luke 1: 30-31"
},
{
"Verse": "Isaiah 7:14"
},
{
"Verse": "Isaiah 9:6"
},
{
"Verse": "John 1:14"
}
],
"Commandments": [
{
"Verse": "Deuteronomy 6:4-5"
},
{
"Verse": "Exodus 20:1-17"
},
{
"Verse": "Matthew 22:34-40"
},
{
"Verse": "Mark 12:28-34"
},
{
"Verse": "John 13:34"
}
],
"Death": [
{
"Verse": "Revelation 21:4"
},
{
"Verse": "Ecclesiastes 12:7"
},
{
"Verse": "John 3:16"
},
{
"Verse": "Psalm 23:4"
},
{
"Verse": "1 Corinthians 15:55-57"
}
]
}