Просмотр ведомого / множественного выбора, возвращающийся к первому элементу в SWFTUI - PullRequest
0 голосов
/ 27 мая 2020

В моем коде есть два режима выбора. Первое окно выбора выбирает содержимое второго. Но проблема в том, что когда я пытаюсь выбрать любое значение из второго окна выбора, оно возвращается к первому элементу.

Видео: 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"
        }
    ]
    }

...