Как добавить NSToolBarDelegate в ViewController - PullRequest
1 голос
/ 24 марта 2020

Я недавно портировал приложение на Ma c Catalyst, и я пытаюсь настроить панель инструментов моего приложения, чтобы по существу отражать приложения MacOS News и Stocks, где у них есть кнопка «Назад» и кнопка «Поделиться» на панели инструментов. См. Ниже:

Желаемый результат:

enter image description here

Этот код работает, когда я добавляю его в AppDelegate, но не когда я добавляю его в обычный класс ViewController.

class ViewController: UIViewController {

override func viewDidLoad() {

        super.viewDidLoad()

        #if targetEnvironment(macCatalyst)

        UIApplication.shared.connectedScenes.compactMap { $0 as? UIWindowScene }.forEach { windowScene in

            if let titlebar = windowScene.titlebar {
                let toolbar = NSToolbar(identifier: "testToolbar")

                titlebar.toolbar = toolbar
                toolbar.delegate = self
                titlebar.titleVisibility = .hidden

            }

        }

        #endif

    }

}

#if targetEnvironment(macCatalyst)

private let SettingsIdentifier = NSToolbarItem.Identifier(rawValue: "SettingsButton")
private let TitleIdentifier = NSToolbarItem.Identifier(rawValue: "Title")
private let NavigationIdentifier = NSToolbarItem.Identifier(rawValue: "BackButton")


extension ViewController: NSToolbarDelegate {

    func toolbar(_ toolbar: NSToolbar, itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier, willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem? {

            if (itemIdentifier == NavigationIdentifier) {

                let barButton = UIBarButtonItem(image: UIImage(systemName: "chevron.left"), style: .done, target: self, action: #selector(test))
                let button = NSToolbarItem(itemIdentifier: itemIdentifier, barButtonItem: barButton)

                return button

            }

            if (itemIdentifier == SettingsIdentifier) {

                let barButton = UIBarButtonItem(image: UIImage(systemName: "ellipsis.circle"), style: .done, target: self, action: #selector(test))
                let button = NSToolbarItem(itemIdentifier: itemIdentifier, barButtonItem: barButton)

                return button

            }

            if (itemIdentifier == TitleIdentifier) {

                let barButton = UIBarButtonItem(title: "My App", style: .plain, target: self, action: nil)
                let button = NSToolbarItem(itemIdentifier: itemIdentifier, barButtonItem: barButton)

                return button

            }

            return nil

        }

        func toolbarDefaultItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {

            return [NavigationIdentifier, NSToolbarItem.Identifier.flexibleSpace, TitleIdentifier, NSToolbarItem.Identifier.flexibleSpace, SettingsIdentifier]

        }

        func toolbarAllowedItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {

            return toolbarDefaultItemIdentifiers(toolbar)

        }

        @objc func test(){

            print("test")

        }

}
#endif


Если у кого-то есть какие-либо идеи о том, как исправить или даже улучшить мою реализацию, я буду благодарен.

Спасибо!

...