Approche 1:
Cela se fait en ajoutant un accessoire de barre de titre. J'ai pu faire cela en modifiant le fichier AppDelegate.swift. J'ai dû appliquer un rembourrage bizarre pour que ça paraisse bien.
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(""))
}
}
Résultat:
Approche 2 (méthode alternative):
L'idée ici est de faire la partie de la barre d'outils en utilisant le storyboard et le reste de l'application en utilisant SwiftUI. Cela se fait en créant une nouvelle application avec storyboard comme interface utilisateur. Ensuite, allez dans le storyboard et supprimez le contrôleur de vue par défaut et ajoutez-en un nouveau NSHostingController
. Connectez le contrôleur d'hébergement nouvellement ajouté à la fenêtre principale en définissant sa relation. Ajoutez votre barre d'outils à la fenêtre à l'aide du générateur d'interface.
Attachez une classe personnalisée à votre NSHostingController
et chargez-y votre vue SwiftUI.
Exemple de code ci-dessous:
import Cocoa
import SwiftUI
class HostingController: NSHostingController<SwiftUIView> {
@objc required dynamic init?(coder: NSCoder) {
super.init(coder: coder, rootView: SwiftUIView())
}
}
L'utilisation de cette approche vous donne également la possibilité de personnaliser la barre d'outils.