Bagaimana cara menambahkan toolbar ke aplikasi macOS menggunakan SwiftUI?

9

Saya mencoba menambahkan bilah alat di dalam bilah judul ke aplikasi macOS menggunakan SwiftUI, sesuatu yang mirip dengan yang ditunjukkan di bawah ini.

Bilah alat di bilah judul di aplikasi macOS

Saya tidak dapat menemukan cara untuk mencapai ini menggunakan SwiftUI. Saat ini, saya memiliki bilah alat (yang hanya memiliki bidang teks) di dalam tampilan saya, tetapi saya ingin memindahkannya ke bilah judul.

Kode saya saat ini:

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

Jadi, dalam kasus saya, saya perlu memiliki bidang teks di dalam bilah alat.

Bijoy Thangaraj
sumber
Saya berbicara tentang SwiftUI di target macOS.
Bijoy Thangaraj
Tidak, pengubah navigasiBarTitle tidak tersedia di macOS SwiftUI.
Bijoy Thangaraj
Toolbar tidak didukung di SwiftUI untuk saat ini. Jika Anda benar-benar membutuhkannya (mengapa?) Lalu gunakan dari AppKit, masih ada ... sungguh.
Asperi
@ Asperi saya bisa melakukan ini - silakan lihat jawabannya di bawah. Bilah alat (atau aksesori batang judul) masih banyak digunakan di aplikasi macOS, bukan?
Bijoy Thangaraj
@ Asperi Untuk menggunakan yang dari AppKit, maksud Anda menggunakan NSViewRepresentable untuk NSToolbar? Jika demikian, saya mencoba metode itu tetapi tidak berhasil. Jika Anda memiliki solusi seperti itu, saya ingin memeriksanya.
Bijoy Thangaraj

Jawaban:

4

Pendekatan 1:

Ini dilakukan dengan menambahkan aksesori batang judul. Saya bisa menyelesaikan ini dengan memodifikasi file AppDelegate.swift. Saya harus menerapkan beberapa bantalan aneh agar terlihat benar.

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(""))

    }
}

Hasil:

Konten di dalam bilah alat macOS

Pendekatan 2 (Metode alternatif):

Idenya di sini adalah melakukan bagian toolbar menggunakan storyboard dan aplikasi lainnya menggunakan SwiftUI. Ini dilakukan dengan membuat aplikasi baru dengan storyboard sebagai antarmuka pengguna. Lalu pergi ke storyboard dan hapus View Controller default dan tambahkan yang baru NSHostingController. Hubungkan Pengendali Hosting yang baru ditambahkan ke jendela utama dengan mengatur hubungannya. Tambahkan toolbar Anda ke jendela menggunakan pembangun antarmuka.

Konfigurasi Storyboard

Lampirkan kelas khusus ke Anda NSHostingControllerdan muat tampilan SwiftUI Anda ke dalamnya.

Contoh kode di bawah ini:

import Cocoa
import SwiftUI

class HostingController: NSHostingController<SwiftUIView> {

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

    }

}

Menggunakan pendekatan ini juga memberi Anda kemampuan untuk menyesuaikan toolbar.

Bijoy Thangaraj
sumber
Apakah ada cara untuk membuatnya dapat diedit dengan mengklik kanan dan memilih "Customize Toolbar"? (Mirip dengan Finder, Halaman, dll.)
sqwk
1
Dengan solusi pertama, tidak. Tapi, lihat pendekatan alternatif yang saya tambahkan pada respons saya di atas. Dengan begitu, Anda mendapatkan opsi untuk menyesuaikan bilah alat.
Bijoy Thangaraj