【问题标题】:NSPopover in Mac Catalyst for Mac menu barMac Catalyst for Mac 菜单栏中的 NSPopover
【发布时间】:2020-12-27 05:17:34
【问题描述】:

我正在尝试将 MenuBar 项添加到我的 Mac Catalyst 应用程序。

我已成功让 iPad 应用程序在 Mac 上运行,但添加 MenuBar 项目却变得相当困难。

我已经尝试使用以下两个链接解决问题,但他们没有我可以查看的 GitHub 存储库,并且解释做了一些跳转。

https://www.highcaffeinecontent.com/blog/20190607-Beyond-the-Checkbox-with-Catalyst-and-AppKit https://developer.apple.com/documentation/xcode/creating_a_mac_version_of_your_ipad_app

现在我的 AppDelegate 中有以下代码:

#if targetEnvironment(macCatalyst)
    import AppKit
    import Cocoa

#endif
import UIKit
import CoreData

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    
    #if targetEnvironment(macCatalyst)
        var popover: NSPopover!
        var statusBarItem: NSStatusItem!
    #endif

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        
        #if targetEnvironment(macCatalyst)
        // Code to include from Mac.
        #endif
        #if targetEnvironment(macCatalyst)
            let contentView = MenuBarView()

            // Create the popover
            let popover = NSPopover()
            popover.contentSize = NSSize(width: 400, height: 500)
            popover.behavior = .transient
            popover.contentViewController = NSHostingController(rootView: contentView)
            self.popover = popover
            
            // Create the status item
            self.statusBarItem = NSStatusBar.system.statusItem(withLength: CGFloat(NSStatusItem.variableLength))
            
            if let button = self.statusBarItem.button {
                button.image = NSImage(named: "MenuBar")
                button.action = #selector(togglePopover(_:))
            }
        #endif
        
        return true
    }
    
    #if targetEnvironment(macCatalyst)
        @objc func togglePopover(_ sender: AnyObject?) {
             if let button = self.statusBarItem.button {
                  if self.popover.isShown {
                       self.popover.performClose(sender)
                  } else {
                       self.popover.show(relativeTo: button.bounds, of: button, preferredEdge: NSRectEdge.minY)
                        self.popover.contentViewController?.view.window?.becomeKey()
                  }
             }
        }
    #endif
    
    
    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        
        guard let windowScene = (scene as? UIWindowScene) else { return }
        
        #if targetEnvironment(macCatalyst)
        if let titlebar = windowScene.titlebar {
            titlebar.titleVisibility = .hidden
            titlebar.toolbar = nil
        }
        #endif

    }

...more code from CoreData

显示的错误

我是 iOS 开发的新手,我真的迷路了,所以非常感谢任何帮助。

编辑

是的,截图来自 AppDelegate。

我正在尝试实现这样的东西: https://github.com/AnaghSharma/Ambar-SwiftUI

到目前为止,我看到的每个实现都将它放入 AppDelegate,这就是为什么我也尝试做同样的事情。

【问题讨论】:

标签: ios swift macos swiftui mac-catalyst


【解决方案1】:

从您的屏幕截图来看,这似乎是您的 Mac 捆绑包 的 AppDelegate。如果是这种情况,那么您需要删除所有 UIKit 和 #if TARGET_MAC_CATALYAT 内容并在 AppKit 中执行所有操作。即用NSResponder代替UIResponder等

至于示例代码,这是一个很好的开始:https://github.com/noahsark769/CatalystPlayground

它包括一个 AppKit 包和加载它的代码。

【讨论】:

  • 我编辑了我的问题并添加了一张图片,这样你就可以看到我想要做什么。你发给我的链接是一个很棒的回购,因为它展示了他们如何将纯 mac 东西与催化剂集成。
  • 啊,我明白了。您链接的那个示例是一个纯 Mac 应用程序,所以它有一个 _ NSApplicationDelegate_ - 注意 NS 前缀,这是 AppKit 而不是 UiKit/Catalyst。我链接的 CatalystPlayground 应该可以帮助你——Mac 包甚至没有应用程序委托,因为它不是应用程序!正如你在他的代码中看到的,你可以为包设置一个“主类”,然后你可以从你的 UIKit 代码中加载它,你可以把你的菜单栏项代码放在那里。
  • PS:我不知道您是否打算使用 SwiftUI,就像您链接的项目一样,但请注意 SwiftUI 和捆绑软件不能很好地运行。 SwiftUI 预览版根本不起作用,您可能会遇到其他问题。
  • 我使用 SwiftUI 是因为我发现它比使用 Storyboard 更直观。 (我试过了,真的卡住了)我真的很抱歉我还不太明白这一点。你链接到的操场上有很多东西,我对我需要寻找的东西有点迷茫。您能否指出我应该专门查看的文件。对不起,我真的是 iOS 开发新手。
【解决方案2】:

如果我没记错的话,目前还不能在 Mac Catalyst 中使用 NSPopover。来自苹果文档:

使用 Mac Catalyst 构建的 Mac 应用只能使用标记为 在 Mac Catalyst 中可用,例如 NSToolbar 和 NSTouchBar。苹果 Catalyst 不支持访问不可用的 AppKit API。

并且 Mac Catalyst 未列在可用性平台列表中:

https://developer.apple.com/documentation/appkit/nspopover

【讨论】:

猜你喜欢
  • 2023-01-13
  • 2020-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 2023-03-22
  • 2020-01-27
相关资源
最近更新 更多