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
相关产品推荐
相关产品推荐

