返回 2026-07-14
⚙️ 工程

Paulo Andrade:“关于使用SwiftUI构建Mac-Assed应用的WWDC 27更新”Paulo Andrade: ‘A WWDC 27 Update on Building a Mac-Assed App With SwiftUI’

daringfireball.net·2026-07-12

作者更新了关于使用 SwiftUI 构建 Mac-assed 应用的文章。由于该文章在Mastodon和Daring Fireball等平台上受到广泛关注,苹果工程师主动联系了作者并提供了一些反馈。作者随后提交了相关反馈并进行了更新。

我上一篇关于使用 SwiftUI 构建 Mac-assed 应用的文章获得了比我预期更多的关注。它在 Mastodon 上被多次提及,被收录在 iOS Dev Weekly 中,启发了 5 月份的 Swift Blog Carnival,最终还被 John Gruber(可以说是让“Mac-assed”一词流行起来的主要推手)在 Daring Fireball 上提及。

所有这些关注也促使一位 Apple 工程师主动联系并提供了一些反馈。我们互通了几封邮件,我提交了几个 radar,既然 WWDC 26 已经落下帷幕,这篇文章就作为对我之前写过的问题的一个小更新。

选中状态

关于选中状态,有一个 \.backgroundProminence 环境值是我在写上一篇文章时不知道的。

根据文档,“像 List 和 Table 这样的视图,以及像 ShapeStyle.selection 这样的标准形状样式,会自动更新前景视图的背景显著度(background prominence)。”

这意味着 SwiftUI 已经有了一个内置概念,与我所说的 \.isEmphasized 非常接近。如果你正在使用 List 或 Table,你可以在选中显著度发生变化时检查这个值。

当然,如果你没有使用 List 或 Table——如果你试图进行任何严肃的定制,你可能确实没有使用——那么我之前提到的方法仍然是首选。你需要自己跟踪焦点,并通过环境传递该状态。

区别在于你可以重用 \.backgroundProminence,而不是创建你自己的 \.isEmphasized 值。这有一个很好的副作用,那就是如果你将来把它们放在 List 或 Table 中,你的自定义行会更具兼容性。

我还提交了 FB23095823,提出了一些关于 List 可以暴露哪些内容以使自定义行更有用的想法。我仍然认为这是正确的方向。当你使用 AppKit 或 UIKit 时,你的单元格和行具有极大的灵活性,而我提出的反馈试图让 List 更接近那里的可能性。

拖放

有一个新的 .onDragSessionUpdated API,它是为 27 OS 版本引入的,并且显然已经在 macOS 26 上可用,它解决了我对 SwiftUI 中拖放最大的问题:从一开始就能了解拖放会话的状态。

我还没有测试过这个,但从理论上讲,它似乎正是缺失的那一块。你终于应该能够在拖动开始时更新你的 UI,并在会话结束时可靠地清理它,即使放置操作发生在你的视图之外。

这正是 AppKit 多年来一直能够做到的事情,所以很高兴看到 SwiftUI 在这方面迎头赶上。

话虽如此,我的应用通常支持最近的两个主要 OS 版本,所以我可能要在两年后才会开始尝试这个。

另外值得一提的是 27 版本中新的 .reorderable 修饰符。如果你只是想允许重新排序,这应该是首选方法。

键盘快捷键

正如我之前提到的,.onMoveCommand 在 iOS 上不可用。解决方法是使用像 .onKeyPress 这样的较低级别抽象,它在 macOS 上也能工作。

这行得通,但并不完全是一回事。.onMoveCommand 是更合适的 API,因为它处理的是意图。我并不真正关心用户是否按下了向下箭头键。我关心的是用户想要向下移动。

起初我假设 .onMoveCommand 在 iOS 上不可用是因为 UIResponder 没有匹配的 move* 选择器。后来我注意到 .onMoveCommand 在 tvOS 上是可用的。

所以我现在又觉得这只是一个 API 可用性上的缺失。如果它在 tvOS 上行得通,那在 iPadOS 上绝对也行得通,毕竟在 iPadOS 上硬件键盘很常见,而且用户也期望能通过方向键进行导航。

我为此提交了 FB23095985。这些微小的平台差异正是削弱跨平台 UI 框架承诺的罪魁祸首。孤立来看它们似乎微不足道,但当你试图共享真正的 UI 代码时,它们很快就会积少成多。

其他槽点

对于我提到的其他问题,我提交了 FB23097100,反映无法得知上下文菜单当前是否处于打开状态;还提交了 FB23102836,建议改进工具栏 API 的易用性。

上下文菜单的问题仍然让我感到特别沮丧。只有当你不打算构建一个标准的 Mac 界面时,这类问题才会显得无关紧要。在 iOS 上,系统可以在视觉上提升参与交互的元素。而在 macOS 上,应用程序需要足够的信息来呈现目标本身。

关于工具栏,WWDC 26 引入了一个新的 .visibilityPriority 修饰符,帮助管理哪些项目应该优先移至溢出菜单。这对我遇到的问题并没有实质帮助,但我觉得还是应该提一下。

需要完整排版与评论请前往来源站点阅读。