You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI读取Plist文件并展示为List组件时无内容显示问题求助

解决SwiftUI读取Plist后List空白的问题

我帮你找出了几个导致界面空白的关键问题,咱们一个个来修复:

1. 没有调用加载数据的方法

你的PresidentViewModel里写了loadProperityListData(),但从来没执行过它!这就导致PresArray一直是空数组,List自然没东西显示。

2. ViewModel没有正确绑定到视图

在ContentView里,你只是用let声明了presidents实例,但对于ObservableObject类型的ViewModel,必须用@StateObject(iOS 14+)来创建,这样视图才能监听@Published属性的变化,数据更新时自动刷新界面。

3. List里的文本索引错误

你写的Text(presidents.PresArray[].Name)是语法错误,应该用循环里的索引变量来访问数组元素:presidents.PresArray[president].Name

修正后的完整代码

数据模型与视图模型(优化初始化与错误处理)

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 = ""
    
    // 初始化时自动调用加载数据
    init() {
        loadProperityListData()
    }
    
    func loadProperityListData(){
        guard let path = Bundle.main.path(forResource: "presidents", ofType: "plist"),
              let xml = FileManager.default.contents(atPath: path) else {
            print("Unable to access property list presidents.plist") // 用print替代fatalError,避免APP直接崩溃
            return
        }
        do{
            PresArray = try PropertyListDecoder().decode([PresidentModel].self, from: xml)
            // 加空数组判断,防止越界崩溃
            if !PresArray.isEmpty {
                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 {
            print("Unable to decode property list presidents.plist: \(error.localizedDescription)")
        }
    }
}

界面展示代码(修正绑定与遍历逻辑)

import SwiftUI

struct ContentView: View {
    // 用@StateObject绑定ViewModel,确保视图响应数据变化
    @StateObject private var presidents = PresidentViewModel()
    
    var body: some View {
        // 更简洁安全的遍历方式:直接遍历数组元素
        List(presidents.PresArray, id: \.Name) { president in
            Text(president.Name)
        }
        
        // 如果你坚持用索引遍历,修正后的写法:
        // List(presidents.PresArray.indices, id: \.self){ index in
        //     Text(presidents.PresArray[index].Name)
        // }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

额外小建议

  • 遵循Swift命名规范:把PresArray改成小写开头的presArray,变量名一般用驼峰式小写开头
  • 优先选择直接遍历数组元素的方式,比遍历索引更安全、可读性更强
  • 调试阶段尽量用print输出错误信息,不要用fatalError,避免APP直接崩溃影响调试

内容的提问来源于stack exchange,提问作者TheBMan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 17:42:49