[英]SwiftUI, CloudKit - Can't Load Core Data NSPersistentCloudKitContainer
[英]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.