Come faccio ad aggiungere una barra degli strumenti a un'app macOS usando SwiftUI?


9

Sto cercando di aggiungere una barra degli strumenti all'interno della barra del titolo a un'app macOS usando SwiftUI, qualcosa di simile a quello che viene mostrato di seguito.

Barra degli strumenti nella barra del titolo nell'app macOS

Non riesco a trovare un modo per raggiungere questo obiettivo usando SwiftUI. Attualmente, ho la mia barra degli strumenti (che ha solo un campo di testo) nella mia vista, ma voglio spostarlo nella barra del titolo.

Il mio codice attuale:

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

Quindi, nel mio caso, ho bisogno di avere il campo di testo all'interno della barra degli strumenti.


Sto parlando di SwiftUI nel target macOS.
Bijoy Thangaraj,

No, il modificatore navigationBarTitle non è disponibile in macOS SwiftUI.
Bijoy Thangaraj,

La barra degli strumenti non è supportata in SwiftUI per ora. Se ne hai davvero bisogno (perché?) Quindi usane uno da AppKit, è ancora lì ... davvero.
Asperi

@Asperi Sono stato in grado di farlo - vedere la risposta di seguito. Le barre degli strumenti (o gli accessori della barra del titolo) sono ancora ampiamente utilizzate nelle app macOS, no?
Bijoy Thangaraj,

@Asperi Per usare quello di AppKit, intendevi usare NSViewRepresentable per NSToolbar? In tal caso, ho provato questo metodo ma non ho avuto successo. Se hai una soluzione in questo modo, mi piacerebbe verificarla.
Bijoy Thangaraj,

Risposte:


4

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:

Contenuto all'interno della barra degli strumenti di macOS

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.

Configurazione dello storyboard

Allega una classe personalizzata alla tua NSHostingControllere 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.


C'è un modo per renderlo modificabile facendo clic destro e selezionando "Personalizza barra degli strumenti"? (Simile al Finder, Pagine ecc.)
sqwk

1
Con la prima soluzione, no. Ma guarda l'approccio alternativo che ho aggiunto alla mia risposta sopra. In questo modo, hai la possibilità di personalizzare la barra degli strumenti.
Bijoy Thangaraj
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.