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

概述

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

这是怎么回事呢?

且看分解!Let's go!!!;)


问题现象

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

swift 复制代码
List {
    ForEach(showingDialogues, id: \.self) { dialog in
        Text(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 上)即可:

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

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

swift 复制代码
@State var showingDialogues = [String]()

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

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

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

总结

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

感谢观赏!再会啦!8-)

相关推荐
2501_916007472 天前
Windows OpenSSL 生成 iOS 证书,制作 p12 与描述文件,KXBuild 签名实操
windows·vscode·ios·objective-c·个人开发·swift·敏捷流程
00后程序员张2 天前
Windows 开发 iOS App 入门,用 SwiftUI 写第一个 iOS App 装到 iPhone
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
andyweike3 天前
Swift
开发语言·ios·swift
静以修身zzz3 天前
OpenStack对象存储-Swift、OpenStack编排管理-heat、OpenStack网络管理-neutron
linux·运维·服务器·架构·openstack·swift
瓦瓦gogo3 天前
第一次了解 iOS 开发:从 Swift、SwiftUI 到公共组件
ios·swiftui·swift
青峰讲运维4 天前
OpenStack 存储深度解析|Cinder 块存储 + Swift 对象存储原理与完整实操(Yoga)
开发语言·openstack·swift
2501_915106324 天前
Windows 上开发 Unity iOS,使用 KXBuild 进行真机调试、性能采样与打包 ipa
windows·vscode·unity·ios·个人开发·swift·敏捷流程
传奇开心果编程6 天前
组合优先开发范式:从汉字造字原理到声明式UI组件组合思想
android·flutter·ios·swiftui·移动开发·harmonyos·android jetpack
2501_915918416 天前
Windows 上开发 React Native iOS,真机调试、Fast Refresh 与打包 ipa
windows·vscode·react native·ios·个人开发·swift·敏捷流程
szp20056 天前
中文字幕烧进视频后整片空白:CoreText 低报行高,导出照样成功
ios·swift