web-dev-qa-db-fra.com

Vue de l'onglet de l'application macOS SwiftUI avec contrôle segmenté dans la barre d'outils

J'essaie de créer une application macOS avec SwiftUI. J'ai besoin d'un TabView ou quelque chose de similaire, mais lorsque j'utilise TabView le contrôle segmenté n'est pas dans la barre d'outils macOS. Cliquez ici pour voir un exemple de ce que je voudrais

Mon code actuel est:

import SwiftUI

struct ContentView: View {
    var body: some View {
        TabView {
            Text("1")
                .tabItem {
                    Text("1")
            }
        }
    }
}

Le résultat est ici sous forme d'image

Le contrôle segmenté doit être dans la barre d'outils et non dans la vue.

Je vous remercie.

9
NG235

Voici une démonstration simplifiée de l'approche possible pour y parvenir. Testé et fonctionne avec Xcode 11.2.

demo

1) Préparez la fenêtre pour avoir le style et l'arrière-plan nécessaires dans AppDelegate

func applicationDidFinishLaunching(_ aNotification: Notification) {
    // Create the SwiftUI view that provides the window contents.
    let contentView = ContentView()
        .edgesIgnoringSafeArea(.top)
        .frame(minWidth: 480, maxWidth: .infinity, minHeight: 300, maxHeight: .infinity)

    // 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.titlebarAppearsTransparent = true
    window.titleVisibility = .hidden

    window.setFrameAutosaveName("Main Window")
    window.contentView = NSHostingView(rootView: contentView)
    window.makeKeyAndOrderFront(nil)
}

2) Préparez la vue du contenu de la fenêtre pour avoir le comportement nécessaire

struct ContentView: View {
    private let tabs = ["Watch Now", "Movies", "TV Shows", "Kids", "Library"]
    @State private var selectedTab = 0
    var body: some View {
        VStack {
            HStack {
                Spacer()
                Picker("", selection: $selectedTab) {
                    ForEach(tabs.indices) { i in
                        Text(self.tabs[i]).tag(i)
                    }
                }
                .pickerStyle(SegmentedPickerStyle())
                .padding(.top, 8)
                Spacer()
            }
            .padding(.horizontal, 100)
            Divider()
            GeometryReader { gp in
                VStack {
                    ChildTabView(title: self.tabs[self.selectedTab], index: self.selectedTab)
                }
            }
        }
    }
}

struct ChildTabView: View {
    var title: String
    var index: Int

    var body: some View {
        Text("\(title)")
    }
}
1
Asperi