为什么相同的 SwiftUI 代码可以在 iOS 上运行而在 macOS 上却失败?

问题描述

我使用多平台模板构建了一个简单的 SwiftUI 应用。它为 iOS 和 macOS 编译,没有错误或警告。所有代码都在共享文件中,我没有添加任何特定于 iOS 或 macOS 的内容

它可以在 iPhone 和 iPad 模拟器上正确运行。它也似乎在 macOS 上运行,产生了我期待的界面,但它在幕后工作。没有崩溃,只有不正确的行为。预期会发生的所有事情是用户将数据输入到 TextFields 中,并对其进行验证并将其添加到 UserDefaults。在 iOS 版本中,无效数据被拒绝(字段恢复为认值),有效数据存储在 UserDefaults 中,完全符合预期。在 macOS 版本(相同代码)中,所有输入都被拒绝(字段恢复为认值)。

有什么想法吗? SwiftUI 在 macOS 上运行之前是否需要一些额外的东西?

解决方法

研究一个例子,我发现了解决方案。

这是我发现的:

在 iOS 上,当一个字段获得焦点时,它会发出 onEditingChanged(true),当它失去焦点而没有提交时(即),它会发出 onEditingChanged(false);当它通过提交丢失它时,它会发出 onCommit(),然后它会发出 onEditingChanged(false)。恕我直言,最后两个逻辑顺序不正确。我认为你停止编辑,然后才提交。

在 macOS 上,当一个字段获得焦点时,它会保持沉默,但是一旦您输入任何内容,它就会发出 onEditingChanged(true);当它在提交或未提交时失去焦点时,它会发出 onEditingChanged(false) 后跟 onCommit()。恕我直言,这些以正确的逻辑顺序到达,但我们无法区分提交和放弃编辑。

有人可以建议如何区分这些情况吗?