【发布时间】:2022-01-10 10:00:36
【问题描述】:
我目前正在开发一个 SwiftUI 应用程序,我希望它能够跨大多数 Apple 设备(iPhone、手表、iPad、macOS)进行跨平台。该应用程序将在 iOS、iPadOS、watchOS 和 macOS 之间共享大量视图和逻辑。
我想做的是让 macOS 上的应用程序成为菜单栏应用程序。为了给用户提供最好的体验,除了注册一个菜单栏项目之外,我还想使用一个自定义的NSWindow 实例,该实例将类似于NSPopover 附加到菜单栏项目,但在拖到外面时能够分离并且仍然保持普通 NSWindow 的所有外观和感觉,如交通灯控制等。它将与 Cardhop、Fantastical 和 Harvest 菜单栏应用程序类似的功能。
我发现很难将自定义 NSWindow 实例与 SwiftUI 结合使用。我正在使用最新的 SwiftUI 和 Xcode 版本,可能无法降级,因为我使用的是新 MacBook。
我的 Xcode 版本是 13.2.1 和 macOS 12.1
我试图完全控制窗口发生的事情是从 SwiftUI App 结构上的@main 标记辞职并将其移动到我编码的NSApplicationDelegate 实例。我从 macOS 目标中删除了 SwiftUI App 结构,并尝试将@main 和@NSApplicationMain 添加到我的AppDelegate 实现中,但这导致AppDelegate 根本没有运行。应用程序启动,但什么也没发生,控制台中也没有打印任何内容。
我在互联网上读到,在以前的版本中,可以使用 UIKit 遗留生命周期,就我而言,这可以帮助我解决我的问题。因为我做不到,所以我试图摆脱这种情况。
我当前的解决方案是仍然将 SwiftUI App 结构实例作为 @main 并将 @NSApplicationDelegateAdaptor 添加到我的 AppDelegate 实现中,我只需找到已启动的窗口并在其上运行 close()。这是一个我不喜欢的非常老套的解决方案,但如果这是目前唯一可行的解决方案,我可以接受。
我的问题有两个:
是否可以完全放弃使用 App 结构并在最新的 SwiftUI 版本中使用老式的 AppDelegate?
如果不是,如何让 WindowGroup 使用自定义扩展 NSWindow 类,该类将添加我的附加、分离、指向菜单栏项的箭头等功能。
提前感谢您的帮助!
【问题讨论】: