Я не могу загрузить свои данные в динамическом c ListView в SwiftUI - PullRequest
0 голосов
/ 30 апреля 2020

Это связано с моим предыдущим вопросом. Спасибо тем, кто мне помогает. Я попытался загрузить свое приложение, и не только мой ListView пуст, когда я запускаю его на симуляторе, но также я получаю ошибку, пытаясь проанализировать мой json. Я использовал методы из моего предыдущего вопроса, и список только с именами работал хорошо. Однако, когда я использовал NavigationView и NavigationLink, мои списки внезапно исчезают при запуске на симуляторе. Моя цель - создать список языков с каждой строкой, содержащей предложения в качестве деталей. Вот коды ( Edit, код @ nuke1010 работает, но я столкнулся с другой проблемой )

1. Код, который я пытаюсь запустить

// MARK: - WelcomeDetailElement
// MARK: - WelcomeDetailElement
struct WelcomeDetailElement: Codable, Identifiable {
    let name: String
    let id: Int
    let sentence: [Sentence]
}

// MARK: - Sentence
struct Sentence: Hashable, Codable {
    let data: String
    let aux: String?
    let pron: String?
}


struct ContentView: View {
    @State var result : [WelcomeDetailElement] = [WelcomeDetailElement]()
    var body: some View{
        NavigationView{
            List{
                ForEach(result){ lang in
                    NavigationLink(destination: DetailView(sentence: lang.sentence)){
                        Text(lang.name)
                    }
                }
            }
        }
        .onAppear(perform: parseJson)
    }

    func parseJson() {
        if let url = Bundle.main.url(forResource: "twelveData", withExtension: "json"){
            if let data = try? Data(contentsOf: url){
                let jsondecoder = JSONDecoder()
                do{
                    let result = try jsondecoder.decode([WelcomeDetailElement].self, from: data)
                    self.result = result
                }
                catch {
                    print("error trying parse json")
                }
            }
        }
    }
}

struct DetailView: View {
    var sentence: [Sentence]
    var body: some View {
        List{
            ForEach(self.getArray(self.sentence[0]), id: \.self) {
                Text($0)
            }
        }
    }

    func getArray(_ seq: Sentence) -> [String] {
        let list = Mirror(reflecting: seq).children
        var arr = [String]()
        for set in list {
            if let val = set.value as? String {
                arr.append(val)
            }
        }
        return arr
    }
}

2. Фрагмент файла JSON

[
    {
        "name": "English",
        "id": 1,
        "sentence": [
            {"data" : "I eat the apple"},
            {"data" : "It is John's apple"},
            {"data" : "I give John the apple"},
            {"data" : "We give him the apple"},
            {"data" : "He gives it to John"},
            {"data" : "She gives it to him"},
            {"data" : "Is the apple red?"},
            {"data" : "The apples are red"},
            {"data" : "I must give it to him"},
            {"data" : "I want to give it to her"},
            {"data" : "I'm going to know tomorrow"},
            {"data" : "I can't eat the apple"}
        ]
    },
    {
        "name": "Mandarin",
        "id": 2,
        "sentence": [
            {"data" : "我吃的苹果",
        "aux" : "我吃的蘋果",
        "pron" : "Wǒ chī de píngguǒ"},
            {"data" : "之是约翰的苹果",
        "aux" : "之是約翰的蘋果",
        "pron" : "Zhī shì Yuēhàn de píngguǒ"},
            {"data" : "我给约翰的苹果",
        "aux" : "我給約翰的蘋果",
        "pron" : "Wǒ gěi Yuēhàn de píngguǒ"},
            {"data" : "我们给约翰的苹果",
        "aux" : "我們給約翰的蘋果",
        "pron" : "Wǒ men gěi Yuēhàn de píngguǒ"},
            {"data" : "他把它交给约翰",
        "aux" : "他把它交給約翰",
        "pron" : "Tā bǎ tā jiāo gěi Yuēhàn"},
            {"data" : "她给了它",
        "aux" : "她給了它",
        "pron" : "Tā gěi le tā"},
            {"data" : "苹果是红色的吗?",
        "aux" : "蘋果是紅色的嗎?",
        "pron" : "Píngguǒ shì hóngsè de ma?"},
            {"data" : "苹果是红色的",
        "aux" : "苹果是红色的",
        "pron" : "Píngguǒ shì hóngsè de"},
            {"data" : "我必须给他",
        "aux" : "我必須給他",
        "pron" : "Wǒ bìxū gěi tā"},
            {"data" : "我想给他",
        "aux" : "我想給他",
        "pron" : "Wǒ xiǎng gěi tā"},
            {"data" : "我明天要知道",
        "aux" : "我明天要知道",
        "pron" : "Wǒ míngtiān yào zhīdào"},
            {"data" : "我不吃的苹果",
        "aux" : "我不吃的蘋果",
        "pron" : "Wǒ bù chī de píngguǒ"}
        ]
    },
    {
        "name": "French",
        "id": 3,
        "sentence": [
            {"data" : "Je mange la pomme"},
            {"data" : "C’est la pomme de John"},
            {"data" : "Je donne la pomme à John"},
            {"data" : "On lui donne la pomme"},
            {"data" : "Il la donne à John"},
            {"data" : "Elle la lui donne"},
            {"data" : "Est-ce que la pomme est rouge? or Elle est rouge, la pomme?"},
            {"data" : "Les pommes est rouges"},
            {"data" : "Je dois la lui donner"},
            {"data" : "Je veux la lui donner"},
            {"data" : "Je le saurai demain"},
            {"data" : "Je ne peux pas manger la pomme"}
        ]
    },
    {
        "name": "German",
        "id": 4,
        "sentence": [
            {"data" : "Ich esse den Apfel"},
            {"data" : "Es ist Johns Apfel"},
            {"data" : "Ich gebe John den Apfel"},
            {"data" : "Wir geben ihm den Apfel"},
            {"data" : "Er gibt ihn John"},
            {"data" : "Sie gibt ihn ihm"},
            {"data" : "Ist der Apfel rot?"},
            {"data" : "Die Äpfel sind rot"},
            {"data" : "Ich muss ihn ihm geben"},
            {"data" : "Ich will ihn ihr geben"},
            {"data" : "Ich werde es morgen wissen"},
            {"data" : "Ich kann den Apfel nicht essen"}
        ]
    },
    {
        "name": "Hindi",
        "id": 8,
        "sentence": [
            {"data" : "मैं सेब खा सकता/सकती*",
        "aux" : "Main seb khaa sakata/sakti*"},
            {"data" : "यह सेब जॉन का है",
        "aux" : "Yeh seb John ka hai"},
            {"data" : "मैं जॉन को सेब देता/देती* हूं",
        "aux" : "Main John ko seb deta/deti* hoon"},
            {"data" : "हम उसे सेब देते हैं",
        "aux" : "Hum usse seb dete hain"},
            {"data" : "वह जॉन वह वह देता है",
        "aux" : "Voh ise jon ko data hai"},
            {"data" : "वह इसे उसको देती है",
        "aux" : "Voh ise usko deti hai"},
            {"data" : "क्या सेब लाल है?",
        "aux" : "Kya seb laal hai?"},
            {"data" : "सेब लाल हैं",
        "aux" : "Seb laal hain"},
            {"data" : "मुझे इसे उसको देना चाहिए",
        "aux" : "Mujhe ise usko data chaahie"},
            {"data" : "मैं इसे उसको देना चाहता/चाहती* हूँ",
        "aux" : "Main usse voh dena chahta/chahti* hoon"},
            {"data" : "मैं कल जानने वाला/वाली* हूँ",
        "aux" : "Main ise usko data vaalaa/vaali* hun"},
            {"data" : "मैं सेब नहीं खा सकता/सकती*",
        "aux" : "Main seb nahin kha sakata/sakti*"}
        ]
    }
]

3. Результат моего DetailView показывает только первый объект в массиве предложений Показывает только первый объект

1 Ответ

0 голосов
/ 01 мая 2020

Редактировать: Для обновленного JSON, о котором идет речь, добавление вложенного NavigationView может помочь отобразить все данные.

import SwiftUI

struct WelcomeDetailElement: Codable, Identifiable {
    let name: String
    let id: Int
    let sentence: [Sentence]
}

// MARK: - Sentence
struct Sentence: Hashable, Codable {
    let data: String
    let aux: String?
    let pron: String?
}


struct ContentView: View {
    @State var result : [WelcomeDetailElement] = [WelcomeDetailElement]()
    var body: some View{
        NavigationView{
            List{
                ForEach(result){ lang in
                    NavigationLink(destination: DetailView(sentences: lang.sentence)){
                        Text(lang.name)
                    }
                }
            }
        }
        .onAppear(perform: parseJson)
    }

    func parseJson() {
        if let url = Bundle.main.url(forResource: "twelveData", withExtension: "json"){
            if let data = try? Data(contentsOf: url){
                let jsondecoder = JSONDecoder()
                do{
                    let result = try jsondecoder.decode([WelcomeDetailElement].self, from: data)
                    self.result = result
                }
                catch {
                    print("error trying parse json")
                }
            }
        }
    }
}

struct DetailView: View {
    var sentences: [Sentence]
    var body: some View {
        VStack {
            List{
                ForEach(self.sentences, id: \.self) { sentence in
                    VStack {
                        NavigationLink(destination: SentenceView(sentence: sentence)){
                            Text(sentence.data)
                        }
                    }
                }
            }
        }
    }
}

struct SentenceView: View {
    var sentence: Sentence
    var body: some View {
        VStack(alignment: .leading, spacing: 20) {
            Text(sentence.data).font(.title)
            Divider()
            if sentence.aux != nil {
                Text("Aux: "+(sentence.aux ?? "")).bold()
            }
            if sentence.pron != nil {
                Text("Pron: "+(sentence.pron ?? "")).bold()
            }
            Spacer()
        }.padding()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...