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

SwiftUI预览正常模拟器白屏,List内容不显示及Table View疑问

问题排查与解决方案

首先明确:你用的SwiftUI的List是完全正确的列表实现方案,不需要改用UIKit的TableView,模拟器白屏和预览正常的差异,主要从以下几个方向排查:

1. 确认ViewModel的核心实现是否正确

你的ViewModel必须满足ObservableObject协议,且存储数据的courses数组需要用@Published修饰,否则视图无法感知数据变化。同时Tournament结构体需要符合Equatable(因为你用了id: \.self作为ForEach的标识)。示例正确的ViewModel结构:

import Foundation

// 确保Tournament符合Equatable
struct Tournament: Equatable {
    let name: String
    let dates: String
    let datee: String
    let location: String
}

class ViewModel: ObservableObject {
    // 用@Published标记,让视图监听数组变化
    @Published var courses: [Tournament] = []

    func fetch() {
        // 这里是数据加载逻辑,预览正常说明你可能在预览时给了测试数据
        // 模拟器中要确保这段代码能正确填充courses
        // 先加测试数据验证:
        courses = [
            Tournament(name: "测试赛事1", dates: "2024-05-01", datee: "2024-05-03", location: "上海"),
            Tournament(name: "测试赛事2", dates: "2024-06-10", datee: "2024-06-12", location: "广州")
        ]
    }
}

2. 检查App的根视图设置

确认你的App入口文件(通常是YourAppName.swift)里,根视图是TourContentView而不是默认的ContentView:

@main
struct YourTourApp: App {
    var body: some Scene {
        WindowGroup {
            TourContentView() // 确保这里是你的自定义视图
        }
    }
}

3. 调试数据加载流程

在模拟器运行时,通过打印日志或断点确认:

  • onAppear是否触发了viewModel.fetch():可以在fetch()方法开头加print("开始加载数据")
  • courses数组是否被正确赋值:在fetch()结束后加print("加载完成,数据数量:\(courses.count)")

如果fetch()没触发,检查NavigationView的层级是否影响onAppear;如果数据数量为0,说明数据加载逻辑在模拟器环境下有问题(比如网络请求失败、本地资源读取错误等)。

4. 其他细节检查

  • 图片资源:你代码里用了Image(""),空字符串会导致图片加载失败,但这不会导致整个页面白屏,只是列表项里的图片区域异常
  • 模拟器缓存:可以尝试清理模拟器缓存(重启模拟器或点击Product > Clean Build Folder)后重新运行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 22:04:59