SwiftUI 在 iOS 18 中的 ForEach 点击手势逻辑发生改变的解决

在这里插入图片描述

概述

原本在 iOS 17 中运行良好的 SwiftUI 代码突然在 iOS 18 无法正常工作了,具体表现为原来视图中的的点击手势无法响应。

这是怎么回事呢?

在这里插入图片描述

且看分解!Let’s go!!!😉


问题现象

在这里插入图片描述

从下面的演示代码可以看到,我们在 List 容器的 ForEach 视图上添加了点击手势:

List {ForEach(showingDialogues, id: \.self) { dialog inText(dialog).font(.title3.weight(.bold)).listRowSeparator(.hidden)}.onTapGesture {if index < dialogues.count {showingDialogues.append(dialogues[index])index += 1} else {isShowQuizView = true}}
}

这在 iOS 17 中工作正常,但是升级至 iOS 18 后点击却无任何反应,检查发现是点击手势的回调并没有被触发。

解决之道

解决非常简单,我们只需将原来直接附着在 ForEach 上的手势修改器移动至外层(比如 List 上)即可:

List {ForEach(showingDialogues, id: \.self) { dialog inText(dialog).font(.title3.weight(.bold)).listRowSeparator(.hidden)}
}
.listStyle(.plain)
.onTapGesture {if index < dialogues.count {showingDialogues.append(dialogues[index])index += 1} else {isShowQuizView = true}
}

究其原因,我们注意到:之前旧代码中视图在显示时 showingDialogues 状态数组的内容为空。

@State var showingDialogues = [String]()

这在 iOS 18 之前的系统里,ForEach 仍会产生可点击范围,但是在 iOS 18 中并不会。

我们猜测原因是 iOS 18 对视图可见性检查更加严格了。因为按照常理来说当 ForEach 构造器对应的集合为空时其不应该再产生可点击的范围,所以这是 iOS 18 行为更加严谨的表现。

在这里插入图片描述

希望本篇博文可以一解大家的燃眉之急。


更多苹果开发中恢诡谲怪的问题和奇妙的调试秘笈,请小伙伴们移步我的精品专栏《开发疑难秒懂百科》观赏更多精彩的内容。

在这里插入图片描述

  • 开发疑难秒懂百科

总结

在本篇博文中,我们讨论了 iOS 18 中的 SwiftUi ForEach 视图点击逻辑和之前略有不同的情况,并给出解决方法。这可能是 SwiftUI 在 iOS 18 系统中变得更加严谨了。

感谢观赏!再会啦!😎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/56026.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图书馆自习室座位预约管理微信小程序+ssm(lw+演示+源码+运行)

摘 要 随着电子商务快速发展世界各地区,各个高校对图书馆也起来越重视.图书馆代表着一间学校或者地区的文化标志&#xff0c;因为图书馆丰富的图书资源能够带给我们重要的信息资源&#xff0c;图书馆管理系统是学校管理机制重要的一环&#xff0c;,面对这一世界性的新动向和新…

【SQL】深入了解 SQL 索引:数据库性能优化的利器

目录 引言1. 什么是 SQL 索引&#xff1f;1.1 索引的基本概念1.2 索引的优缺点 2. 索引的工作原理2.1 B 树索引2.2 哈希索引2.3 全文索引 3. 索引创建方式3.1 单列索引示意图3.2 复合索引示意图3.3 唯一索引示意图 4. 如何创建索引4.1 创建单列索引4.2 创建唯一索引4.3 创建全文…

在ES6中,数组新增扩展及其用法汇总

在ES6中&#xff0c;数组新增了多项扩展&#xff0c;极大提高了操作数组的便捷性。以下是一些常用的扩展及其用法&#xff1a; 1. Array.from() 用于从类数组对象或迭代器创建一个新的数组实例。这个方法可以接受两个参数&#xff1a; source (来源)&#xff1a;这是必须的参…

Docker-nginx数据卷挂载

数据卷&#xff08;volume&#xff09;是一个虚拟目录&#xff0c;是容器内目录与宿主机目录之间映射的桥梁。 以Nginx为例&#xff0c;我们知道Nginx中有两个关键的目录&#xff1a; html&#xff1a;放置一些静态资源conf&#xff1a;放置配置文件 如果我们要让Nginx代理我们…

vue3.2实现AES加密解密,秘钥通过API获取,并混淆秘钥,后端thinkphp

aes.ts文件 import CryptoJS from "crypto-js"; import axios from "axios";export const encrypt async(data: any) > {let storeKey sessionStorage.getItem(a)let storeIv:any sessionStorage.getItem(i)// 如果秘钥或 IV 不存在&#xff0c;尝试…

磁盘存储链式结构——B树与B+树

红黑树处理数据都是在内存中&#xff0c;考虑的都是内存中的运算时间复杂度。如果我们要操作的数据集非常大&#xff0c;大到内存已经没办法处理了该怎么办呢&#xff1f; 试想一下&#xff0c;为了要在一个拥有几十万个文件的磁盘中查找一个文本文件&#xff0c;设计的…

Dockerfile 详解

Dockerfile是自定义Docker镜像的一套规则&#xff0c;由多条指令构成&#xff0c;每条指令都会对应于Docker镜像中的每一层&#xff0c;因为Docker是分层存储的。以下是Dockerfile中各个参数的详解及演示解析&#xff1a; 1. FROM 功能&#xff1a;指定待扩展的父级镜像&#…

Lumerical脚本语言——材料数据库(Material database)

下面的命令用来在材料数据库添加或者拷贝材料&#xff0c;以及设置材料属性&#xff0c;并在任何频率验证给定材料所得到的复反射率。&#xff08;通过简单地对反射率开方就可以得到介电常数&#xff09;。本部分同 INTERCONNECT 不相关。 命令描述 addmaterial 向材料数据库添…

在 Linux 系统中设置 Service 服务开机自启的详细指南

目录 在 Linux 系统中设置 Service 服务开机自启的详细指南一、Linux 服务管理概述二、systemd 中设置服务开机自启2.1 systemd 介绍2.2 如何检查服务的状态2.3 启用服务开机自启2.4 手动启动和停止服务2.5 检查服务是否成功启用2.6 禁用开机自启服务 三、在 sysvinit 中设置服…

sass学习笔记(1.0)

1.使用变量 sass可以像声明变量那样进行使用&#xff0c;这样同样的样式&#xff0c;就可以使用相同的变量来提高复用。 语法为&#xff1a;$ 变量名 在界面中也可以正常的显示 当然了&#xff0c;变量之间也可以相互引用&#xff0c;比如下面 div{$_color: #d45387;$BgColo…

用C++编写信息管理系统(歌单信息管理)

C语言是面向过程的编程语言&#xff0c;而C是面向对象的编程语言&#xff0c;在书写代码时风格有所不同&#xff08;也存在很多共性&#xff09;。 程序说明 本次系统程序使用的是C语言进行编写&#xff0c;主要考虑怎么实现面向对象的问题。 因为本次程序属于小型系统程序&…

多元线性回归:机器学习中的经典模型探讨

引言 多元线性回归是统计学和机器学习中广泛应用的一种回归分析方法。它通过分析多个自变量与因变量之间的关系&#xff0c;帮助我们理解和预测数据的行为。本文将深入探讨多元线性回归的理论背景、数学原理、模型构建、技术细节及其实际应用。 一、多元线性回归的背景与发展…

在Ubuntu上安装Docker以及使用

文章目录 一、安装Docker二、启动与测试Docker三、设置Docker自动启动四、添加Docker用户组&#xff08;可选&#xff09;五、Docker的常用命令六、Docker容器的使用 以下是在Ubuntu上安装Docker以及使用的详细教程&#xff1a; 一、安装Docker 更新软件包索引 在安装Docker之前…

2024免费mac苹果电脑清理垃圾软件CleanMyMac X4.15.8

对于苹果电脑用户来说&#xff0c;设备上积累的垃圾文件可能会导致存储空间变得紧张&#xff0c;影响电脑的性能和使用体验。尤其是那些经常下载和安装新应用、编辑视频或处理大量照片的用户&#xff0c;更容易感受到存储空间的压力。面对这种情况&#xff0c;寻找一种有效的苹…

在 Spring 容器初始化 Bean 时,通过反射机制处理带有自定义 注解的字段,并将其注入相应的 Spring 管理的 Bean

背景:我们之前项目用的自己研发的框架,后来又要重构,但是有些功能还依赖于之前的框架,万不得已的情况下,我就把之前的框架当成三方的依赖给引入,引入以后就发现,很多类上用了Inject这个注解,再一看包名竟然是自定义的,这几个类就是无法注入到spring中,用了好多种方法,使用的时候…

计组_中断响应的步骤

2024.10.13&#xff1a;计算机组成原理学习笔记 中断响应步骤 中断响应 &#xff08;中断响应的过程也称中断隐指令&#xff09;第一步&#xff1a;关中断第二步&#xff1a;保存断点第三步&#xff1a;引出中断服务程序中断源识别判优方法1&#xff1a;软件查询方法中断源识别…

【面经】保融笔试

一共十二面&#xff0c;题目比较基础&#xff0c;20分主观题40分不定项选择20分SQL20分手写编程 主观题 问奖学金&#xff0c;别人对自己的评价和自己的看法&#xff0c;自己最大的优缺点&#xff0c;期望工作地点以及对出差的看法 不定项选择&#xff1a; 第一部分是计算机…

74.【C语言】文件操作(1)

目录 1.进行文件操作的原因 销毁的示例 2.文件的类型 1.操作文件的步骤 2.文件名 3.查看文件路径的方法 方法1 方法2 方法3 4.数据文件的介绍 举例 ① ASCII码的形式(即字符形式)存储 ②二进制形式存储 理解"不加转换"的含义 1.进行文件操作的原因 为…

maven加载依赖成功但是引入import不了包,注解报错

突然就复现不出来了&#xff0c;奇了怪了&#xff0c;简单说一下吧&#xff0c;就是模块里引入了SpringBoot Test那个依赖然后&#xff0c; 这个地方是显示引入成功的&#xff0c;但是 这个包下没有&#xff0c;导致我SpringBootTest一直出不来&#xff0c;就找不到这个包下的注…