SwiftUI:调用带有锚点.center的scrollTo方法时崩溃

如何解决SwiftUI:调用带有锚点.center的scrollTo方法时崩溃

不确定100%是否是由anchor引起的,因为我刚刚将其移除并且到目前为止还没有发生过崩溃(如果发生更多崩溃,将会报告)-有人可以检查并帮助查看是否可能错误在哪里?也要提交Apple Bug。

我的视图如下:

var body: some View {
    ScrollViewReader { scrollProxy in
        ScrollView {
            if isShowingContent {
                LazyVStack {
                    ForEach(mo.msgMos.indices,id: \.self) { i in
                        ...
                    }
                }
            }
        }
        .onChange(of: mo.scrollToIdx) { idx in
            withAnimation {
                scrollProxy.scrollTo(targetIdx,anchor: .center)
            }
        }
    }
}

崩溃堆栈如下所示:

Crashed: com.apple.main-thread
0  AttributeGraph                 0x1cedce974 AGGraphGetValue + 284
1  SwiftUI                        0x1addcbe5c _ViewCache.layout.getter + 52
2  SwiftUI                        0x1addcc2f4 _ViewCache.withPlacementData<A>(_:) + 160
3  SwiftUI                        0x1addd02d0 closure #1 in IncrementalScrollable.makeTarget(at:anchor:) + 336
4  SwiftUI                        0x1addd6a9c partial apply for closure #1 in IncrementalScrollable.makeTarget(at:anchor:) + 56
5  SwiftUI                        0x1ae2241fc HostingScrollView.updateAnimationTarget(_:) + 216
6  SwiftUI                        0x1ae2245c4 HostingScrollView.bounds.didset + 188
7  SwiftUI                        0x1ae2244e8 HostingScrollView.bounds.setter + 128
8  SwiftUI                        0x1ae22444c @objc HostingScrollView.bounds.setter + 44
9  UIKitCore                      0x1aa494e4c -[UIScrollView setContentOffset:] + 804
10 UIKitCore                      0x1aa48f1e0 -[UIScrollViewScrollAnimation setProgress:] + 320
11 UIKitCore                      0x1a95094b8 -[UIAnimator _advanceAnimationsOfType:withTimestamp:] + 276
12 QuartzCore                     0x1aa8e46a4 CA::Display::DisplayLink::dispatch_items(unsigned long long,unsigned long long,unsigned long long) + 664
13 QuartzCore                     0x1aa9bb1a0 display_timer_callback(__CFMachPort*,void*,long,void*) + 280
14 CoreFoundation                 0x1a7633ce4 __CFMachPortPerform + 176
15 CoreFoundation                 0x1a7658098 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 60
16 CoreFoundation                 0x1a7657440 __CFRunLoopDoSource1 + 596
17 CoreFoundation                 0x1a7651320 __CFRunLoopRun + 2360
18 CoreFoundation                 0x1a76504bc CFRunLoopRunSpecific + 600
19 GraphicsServices               0x1be0d5820 GSEventRunModal + 164
20 UIKitCore                      0x1a9ff4734 -[UIApplication _run] + 1072
21 UIKitCore                      0x1a9ff9e10 UIApplicationMain + 168
22 Fablur                         0x102453f8c main + 12 (AppDelegate.swift:12)
23 libdyld.dylib                  0x1a7317e60 start + 4

解决方法

我发现,如果您使用 scrollTo 和锚点 并且它将滚动视图的内容定位到通常无法通过正常滚动到达的位置,那么它会在以下情况下崩溃视图被移除。

例如。滚动到滚动视图中的最后一个视图并使用 .leading 或 .center 位置。

我通过在滚动视图的末尾添加一个空白视图来解决这个问题。不理想但有效。

,

我认为应该将其连接在其他位置

var body: some View {
    ScrollViewReader { scrollProxy in
        ScrollView {
            if isShowingContent {
                LazyVStack {
                    ForEach(mo.msgMos.indices,id: \.self) { i in
                        ...
                    }
                }
                .onChange(of: mo.scrollToIdx) { idx in
                   withAnimation {
                      scrollProxy.scrollTo(targetIdx,anchor: .center)
                   }
                }
            }
        }
    }
}
,

我遇到了非常相似的问题,并得出了(潜在的)结论,即ScrollViewReader不能正确计算,因为您的内容位于LazyVStack中,并且由于Lazy项没有预加载...阅读器没有知道滚动视图实际上有多长时间。至少这是我的猜测...

,

去掉 withAnimation 块,你会没事的

.onChange(of: mo.scrollToIdx) { idx in
    scrollProxy.scrollTo(targetIdx,anchor: .center)
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-