SwiftUI: наличие plist для отображения

Я пытаюсь прочитать 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 будет отображаться как List :

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()
    }
}

Почтовый индекс в виде текста, а не изображения.

Joakim Danielson 09.04.2022 16:54

когда вы вызываете load… ? Ваш массив пуст, потому что вы не загружаете в него данные.

Ptit Xav 09.04.2022 17:02
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
2
38
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Прежде всего, пожалуйста, соблюдайте соглашение об именах и объявите имена членов структуры начальными строчными буквами и добавьте свойство 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"
    }
}

Основная проблема в том,, что вы не загружаете данные, хорошим местом является метод init наблюдаемого класса. Свойства не нужны, потому что массив содержит все данные

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

Другие вопросы по теме