Enfoque 1:
Esto se hace agregando un accesorio de barra de título. Pude hacer esto modificando el archivo AppDelegate.swift. Tuve que aplicar un relleno extraño para que se vea 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(""))
}
}
Resultado:
Enfoque 2 (Método alternativo):
La idea aquí es hacer la parte de la barra de herramientas usando storyboard y el resto de la aplicación usando SwiftUI. Esto se hace creando una nueva aplicación con storyboard como interfaz de usuario. Luego vaya al guión gráfico y elimine el controlador de vista predeterminado y agregue uno nuevo NSHostingController
. Conecte el controlador de alojamiento recientemente agregado a la ventana principal configurando su relación. Agregue su barra de herramientas a la ventana usando el generador de interfaces.
Adjunte una clase personalizada a su NSHostingController
y cargue su vista SwiftUI en ella.
Código de ejemplo a continuación:
import Cocoa
import SwiftUI
class HostingController: NSHostingController<SwiftUIView> {
@objc required dynamic init?(coder: NSCoder) {
super.init(coder: coder, rootView: SwiftUIView())
}
}
El uso de este enfoque también le brinda la posibilidad de personalizar la barra de herramientas.