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

SwiftUI ScrollViewReader无法生效且项目构建速度过慢问题求助

问题修复方案

一、ScrollViewReader不生效的修复点

  • AppStorage类型不匹配:同一个key scrollToIndex 在两个视图中定义的类型不一致,ZolaiTitles 中是可选型Int?,HymnLyrics 中是普通Int,会导致值读取异常。统一修改为非可选型即可,比如把ZolaiTitles中的定义改为@AppStorage("scrollToIndex") var scrollToIndex: Int = 1。
  • id挂载位置错误:当前把.id(lyric.number)挂载到了行内的Text控件上,应该把id挂载到List的每一行的根容器上,取消你注释的那行.id(lyric.number),删掉Text上的id即可,ScrollViewReader在List中查找id是匹配行级元素的标识。
  • 滚动触发时机问题:如果点击按钮后是首次加载HymnLyrics视图,onChange会在List还没完成渲染的时候触发,此时找不到对应id导致滚动失效。可以在ScrollViewReader闭包内补充onAppear逻辑:
.onAppear {
    proxy.scrollTo(scrollToIndex, anchor: .top)
}

二、构建速度慢的修复点

  • 修复冗余的属性初始化表达式:你当前fontSizeIndex的初始化代码Int("Medium") ?? 18是完全冗余的,字符串"Medium"转Int永远返回nil,直接写默认值即可:@AppStorage("fontSizeIndex") var fontSizeIndex = 18,这种复杂的运行时转换写在属性初始化位置会大幅增加编译器类型推断的耗时。
  • 避免在视图存储属性中执行耗时操作:ZolaiTitles中的zoLyrics属性每次实例化视图都会执行一次全量排序,建议把排序逻辑提前到LyricList中预计算,或者改成lazy修饰的属性,减少初始化负担。
  • 明确闭包参数类型降低推断耗时:排序闭包可以明确标注参数和返回值类型,减少编译器的类型推断工作量:
let zoLyrics: [Lyric] = LyricList.hymnLa.sorted { (lhs: Lyric, rhs: Lyric) -> Bool in
    lhs.zoTitle < rhs.zoTitle
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 14:39:03