NSPopover в Mac Catalyst для строки меню Mac

Sep 09 2020

Я пытаюсь добавить элемент 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, поэтому я пытаюсь сделать то же самое.

Ответы

1 Adam Sep 09 2020 at 22:32

На скриншоте видно, что это пакет AppDelegate для вашего Mac . В этом случае вам нужно удалить все UIKit и #if TARGET_MAC_CATALYAT и сделать все в AppKit. То есть использовать NSResponder вместо UIResponder и т. Д.

Что касается примера кода, это отличное начало: https://github.com/noahsark769/CatalystPlayground

Он включает пакет AppKit и код для его загрузки.