Как добавить панель инструментов в приложение MacOS с помощью SwiftUI?

9

Я пытаюсь добавить панель инструментов внутри строки заголовка в приложение MacOS, используя SwiftUI, что-то похожее на то, что показано ниже.

Панель инструментов в заголовке приложения MacOS

Я не могу найти способ добиться этого с помощью SwiftUI. В настоящее время у меня есть панель инструментов (в которой только текстовое поле), но я хочу переместить ее в строку заголовка.

Мой текущий код:

struct TestView: View {
    var body: some View {
        VStack {
            TextField("Placeholder", text: .constant("")).padding()
            Spacer()
        }
    }
}

Итак, в моем случае мне нужно иметь текстовое поле внутри панели инструментов.

Биджой Тангарадж
источник
Я говорю о SwiftUI в MacOS.
Биджой Тангарадж
Нет, модификатор navigationBarTitle недоступен в macOS SwiftUI.
Биджой Тангарадж
Панель инструментов в SwiftUI пока не поддерживается. Если вам действительно нужен (почему?), Тогда используйте один из AppKit, он все еще там ... на самом деле.
Аспери
@ Asperi Мне удалось это сделать - смотрите ответ ниже. Панели инструментов (или аксессуары заголовков) все еще широко используются в приложениях macOS, не так ли?
Биджой Тангарадж
@Asperi Чтобы использовать один из AppKit, вы имели в виду использование NSViewRepresentable для NSToolbar? Если так, то я попробовал этот метод, но безуспешно. Если у вас есть решение таким образом, я хотел бы проверить его.
Биджой Тангарадж

Ответы:

4

Подход 1:

Это делается путем добавления титульного аксессуара. Я смог сделать это, изменив файл AppDelegate.swift. Мне пришлось применить некоторые странные отступы, чтобы все выглядело правильно.

AppDelegate.swift

func applicationDidFinishLaunching(_ aNotification: Notification) {
        // Create the SwiftUI view that provides the window contents.
        let contentView = ContentView()

        // Create the titlebar accessory
        let titlebarAccessoryView = TitlebarAccessory().padding([.top, .leading, .trailing], 16.0).padding(.bottom,-8.0).edgesIgnoringSafeArea(.top)

        let accessoryHostingView = NSHostingView(rootView:titlebarAccessoryView)
        accessoryHostingView.frame.size = accessoryHostingView.fittingSize

        let titlebarAccessory = NSTitlebarAccessoryViewController()
        titlebarAccessory.view = accessoryHostingView       

        // Create the window and set the content view. 
        window = NSWindow(
            contentRect: NSRect(x: 0, y: 0, width: 480, height: 300),
            styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView],
            backing: .buffered, defer: false)
        window.center()
        window.setFrameAutosaveName("Main Window")

        // Add the titlebar accessory
        window.addTitlebarAccessoryViewController(titlebarAccessory)

        window.contentView = NSHostingView(rootView: contentView)
        window.makeKeyAndOrderFront(nil)
    }

TitlebarAccessory.swift

import SwiftUI

struct TitlebarAccessory: View {
    var body: some View {

        TextField("Placeholder", text: .constant(""))

    }
}

Результат:

Содержимое внутри панели инструментов macOS

Подход 2 (Альтернативный метод):

Идея состоит в том, чтобы сделать часть панели инструментов, используя раскадровку, а остальную часть приложения - SwiftUI. Это делается путем создания нового приложения с раскадровкой в ​​качестве пользовательского интерфейса. Затем перейдите к раскадровке, удалите контроллер представления по умолчанию и добавьте новый NSHostingController. Подключите недавно добавленный хостинг-контроллер к главному окну, установив его взаимосвязь. Добавьте вашу панель инструментов в окно, используя конструктор интерфейса.

Конфигурация раскадровки

Присоедините пользовательский класс к вашему NSHostingControllerи загрузите в него представление SwiftUI.

Пример кода ниже:

import Cocoa
import SwiftUI

class HostingController: NSHostingController<SwiftUIView> {

    @objc required dynamic init?(coder: NSCoder) {
        super.init(coder: coder, rootView: SwiftUIView())       

    }

}

Использование этого подхода также дает вам возможность настроить панель инструментов.

Биджой Тангарадж
источник
Есть ли способ сделать его редактируемым, щелкнув правой кнопкой мыши и выбрав «Настроить панель инструментов»? (Аналогично Finder, Pages и т. Д.)
sqwk
1
С первым решением нет. Но посмотрите на альтернативный подход, который я добавил к моему ответу выше. Таким образом, вы получаете возможность настроить панель инструментов.
Биджой Тангарадж