【问题标题】:How to use a custom NSWindow instance on a WindowGroup in SwiftUI如何在 SwiftUI 中的 WindowGroup 上使用自定义 NSWindow 实例
【发布时间】: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 类,该类将添加我的附加、分离、指向菜单栏项的箭头等功能。

提前感谢您的帮助!

【问题讨论】:

    标签: swift macos swiftui


    【解决方案1】:

    实际上退出 SwiftUI 生命周期仍然是可能的,但更难。由于我不是经验丰富的 Apple 开发人员,我不知道该怎么做。

    https://sarunw.com/posts/how-to-create-macos-app-without-storyboard/

    我发现这个,从 Storyboards 教程开始很有帮助。不必从 Storyboards 继续,而是必须从 macOS 目标中删除 SwiftUI 应用程序,跳过删除 storyboards 的事情,然后做剩下的事情。该应用程序对我来说效果很好。关键显然是 main.swift 文件。

    【讨论】:

      猜你喜欢
      • 2021-03-30
      • 1970-01-01
      • 2020-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-10
      相关资源
      最近更新 更多