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

SwiftUI列表向下滚动时变为空白的问题求助

解决SwiftUI子视图List滚动时空白的问题

可能的原因及修复方案

1. 确保数据模型的标识稳定

如果detail模型没遵循Identifiable协议,ForEach复用视图时容易因为id不稳定导致渲染异常,滚动时就会出现空白。

修复方式:

  • 让Detail模型遵循Identifiable:
struct Detail: Identifiable {
    let id = UUID() // 或者用业务上唯一的属性当id,比如detailId
    // 其他属性
}
  • 若无法遵循协议,在ForEach里指定明确的唯一id:
ForEach(viewModel.endorsement.details, id: \.yourUniqueProperty) { detail in
    // 原有视图代码
}

2. 检查视图模型的生命周期

子视图的viewModel如果被意外销毁,会导致数据丢失。要确保用正确的属性包装器管理:

struct EndorsementListDetail: View {
    @ObservedObject var viewModel: YourDetailViewModel // 若viewModel是外部传入用这个
    // 若viewModel是在当前视图初始化,用@StateObject
    // @StateObject var viewModel = YourDetailViewModel()
    
    var body: some View {
        // 原有代码
    }
}

另外确认viewModel.endorsement.details不会在滚动时被重置,比如异步加载的话要保证数据加载完成后状态稳定。

3. 调整父视图NavigationLink的写法

你把NavigationLink放在ListItem背景里的方式,可能导致导航时状态异常,换成标准写法试试:

NavigationView {
    List {
        ForEach(viewModel.endorsements, id: \.name) { endorsement in
            NavigationLink {
                viewModel.buildEndorsmentListDetail(endorsement)
            } label: {
                EndorsementListItem(endorsement: endorsement)
                    .padding(.vertical, 16)
                    .listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0))
            }
        }
    }
    .padding(.horizontal, 12)
    .listStyle(.plain)
    // 其他代码
}

如果你的项目支持iOS16+,直接用NavigationStack替代NavigationView,它的状态管理更稳定。

4. 简化子视图List的布局设置

子视图里的listRowInsets和嵌套VStack可能引发渲染冲突,试试简化布局:

List {
    ForEach(viewModel.endorsement.details) { detail in
        EndorsementListDetailItem(detail: detail)
            .padding(.vertical, 8)
            .padding(.horizontal, 12)
        Divider()
    }
    .listRowSeparator(.hidden)
    .listRowInsets(EdgeInsets())
}
.listStyle(.plain)

验证步骤

  1. 先排查数据模型的id是否稳定,这是最常见的触发原因;
  2. 换一种NavigationLink的实现方式,排除导航状态异常的问题;
  3. 确认viewModel没有被意外销毁,数据始终可用。

内容的提问来源于stack exchange,提问作者Quốc Anh Lê

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 17:42:33