Approccio 1:
Questo viene fatto aggiungendo un accessorio della barra del titolo. Sono stato in grado di farlo modificando il file AppDelegate.swift. Ho dovuto applicare delle strane imbottiture per farlo sembrare giusto.
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(""))
}
}
Risultato:
Approccio 2 (metodo alternativo):
L'idea qui è di fare la parte della barra degli strumenti usando lo storyboard e il resto dell'app usando SwiftUI. Questo viene fatto creando una nuova app con storyboard come interfaccia utente. Quindi vai allo storyboard ed elimina il controller di visualizzazione predefinito e aggiungi un nuovo NSHostingController
. Collega il controller di hosting appena aggiunto alla finestra principale impostandone la relazione. Aggiungi la tua barra degli strumenti alla finestra usando l'interfaccia builder.
Allega una classe personalizzata alla tua NSHostingController
e carica la tua vista SwiftUI in essa.
Esempio di codice di seguito:
import Cocoa
import SwiftUI
class HostingController: NSHostingController<SwiftUIView> {
@objc required dynamic init?(coder: NSCoder) {
super.init(coder: coder, rootView: SwiftUIView())
}
}
L'uso di questo approccio ti dà anche la possibilità di personalizzare la barra degli strumenti.