SwiftUI中List结合Section与Swipe Actions时行一次性全部加载的问题咨询
SwiftUI List Section + SwipeActions 导致单元格复用失效的问题
这确实是SwiftUI的已知行为(可视为bug),完全不是你的代码实现有问题!
问题原因分析
你遇到的三种场景精准复现了这个问题的触发逻辑:
- 当
List直接包裹ForEach并搭配swipeActions时,SwiftUI的单元格复用机制正常工作,只会加载屏幕可见的行(约21个)。 - 但把
ForEach放到Section内部后再添加swipeActions,SwiftUI会一次性加载所有列表项(1000个),完全跳过了懒加载复用逻辑。 - 一旦移除
swipeActions,Section内的ForEach又会恢复正常的复用行为(加载约18个可见行)。
这个问题在iOS 15到iOS 17的多个SwiftUI版本中都有开发者反馈,本质是Section容器与swipeActions交互时,底层复用逻辑出现异常,没有正确触发懒加载机制。
临时解决方案
如果你的业务需要同时保留Section和SwipeActions功能,可以尝试这些临时方案:
- 自定义Section替代原生组件:如果不需要原生Section的特定样式(比如分组圆角、默认标题布局),可以用
VStack配合分隔线模拟Section的视觉效果,再直接在List中使用带swipeActions的ForEach,这样复用逻辑会恢复正常。 - 用LazyVStack模拟List:将List替换为
ScrollView+LazyVStack手动实现懒加载,不过这种方式需要自行处理列表选中状态、滑动手势等细节,开发成本较高。 - 等待官方修复:这类底层复用逻辑的问题通常会在SwiftUI的后续版本更新中被优化,可关注Apple开发者文档或版本更新日志。
内容的提问来源于stack exchange,提问作者Roman Blum
相关产品推荐
相关产品推荐

