簡體   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