繁体   English   中英

我无法在 SwiftUI 的动态 ListView 中加载我的数据

[英]I can't load my data in a dynamic ListView in SwiftUI

这与我之前的问题有关。 感谢那些帮助我的人。 我尝试加载我的应用程序,但当我在模拟器上运行它时,我的 ListView 不仅是空的,而且我在尝试解析我的 json 时遇到错误。 我使用了上一个问题中的方法,并且仅包含名称的列表运行良好。 但是,当我使用 NavigationView 和 NavigationLink 时,我在模拟器上运行时列表突然消失了。 我的目标是创建一个语言列表,每行都有句子作为细节。 这是代码(编辑,@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的结果只显示语句数组中的第一个object Only Shows The First Object

编辑:对于更新的 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()
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM