SwiftUI:有一个要显示的 plist

SwiftUI: Having a plist to display

我正在尝试读取 plist 并将其显示为 SwiftUI 上的列表。它编译时没有错误或警告,但没有显示任何内容。我不确定我做错了什么或我在这里犯的错误。我尝试了多种方法,但仍然显示空白。


import Foundation

struct PresidentModel: Decodable{
    var Name: String
    var Number: Int
    var StartDate: String
    var EndDate: String
    var Nickname: String
    var PoliticalParty: String
    
    
    enum CodingKeys: String, CodingKey{
        case Name = "Name"
        case Number = "Number"
        case StartDate = "Start Date"
        case EndDate = "End Date"
        case Nickname = "Nickname"
        case PoliticalParty = "Political Party"
    }
}

class PresidentViewModel: ObservableObject{
    @Published var PresArray: [PresidentModel] = []
    @Published var name: String = ""
    @Published var number: Int = 0
    @Published var startDate: String = ""
    @Published var endDate: String = ""
    @Published var nickname: String = ""
    @Published var politicalParty: String = ""
    
    
    func loadProperityListData(){
        guard let path = Bundle.main.path(forResource: "presidents", ofType: "plist"), let xml = FileManager.default.contents(atPath: path) else {
            fatalError("Unable to access property list states.plist")
        }
        
        do{
            PresArray =  try PropertyListDecoder().decode([PresidentModel].self, from: xml)
            name = PresArray[0].Name
            number = PresArray[0].Number
            startDate = PresArray[0].StartDate
            endDate = PresArray[0].EndDate
            nickname = PresArray[0].Nickname
            politicalParty = PresArray[0].PoliticalParty
        }
        
        catch {
            fatalError("Unable to decode property list states.plist")
        }
    }//func
}//class

plist 将显示为列表的位置:

import SwiftUI

struct ContentView: View {
    
    let presidents = PresidentViewModel()
    
    var body: some View {
    
        List(presidents.PresArray.indices, id: \.self){ president in
            Text(presidents.PresArray[].Name)
        }
    }//Body
}//View
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

首先请遵守命名规则,声明struct成员名称以小写字母开头,并加上id 属性

struct PresidentModel: Decodable, Identifiable {
    let id = UUID()
    let name: String
    let number: Int
    let startDate: String
    let endDate: String
    let nickname: String
    let politicalParty: String
    
    private enum CodingKeys: String, CodingKey {
        case name = "Name"
        case number = "Number"
        case startDate = "Start Date"
        case endDate = "End Date"
        case nickname = "Nickname"
        case politicalParty = "Political Party"
    }
}

主要问题是你不加载数据,一个好的地方是observable的init方法class。不需要属性,因为数组包含所有数据

class PresidentViewModel: ObservableObject{
    @Published var presArray: [PresidentModel] = []

   init() {
      loadProperityListData()
   }
    
    func loadProperityListData(){
        guard let url = Bundle.main.url(forResource: "presidents", withExtension: "plist"), 
              let data = try? Data(contentsOf: url) else {
            fatalError("Unable to access property list states.plist")
        }
        
        do {
            presArray =  try PropertyListDecoder().decode([PresidentModel].self, from: data)
        } catch {
            print(error)
            presArray = []
        }
    }//func
}//class

第二个主要问题PresidentViewModel没有声明为@StateObject。并且由于添加了 id 属性 你摆脱了处理索引和指定 id: \.self

import SwiftUI

struct ContentView: View {
    
    @StateObject var model = PresidentViewModel()
    
    var body: some View {
    
        List(model.presArray) { president in
            Text(president.name)
        }
    }//Body
}//View