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

9

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

Mon code actuel est:

import SwiftUI

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

Le résultat est ici comme une image

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

Je vous remercie.

NG235
la source

Réponses:

1

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

démo

1) Préparez la fenêtre pour avoir le style et l'arrière-plan nécessaires 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)")
    }
}
Asperi
la source
Merci pour votre réponse. Je cherche vraiment quelque chose qui ressemble aux applications d'Apple, même si dans AppKit. Votre réponse est cependant appréciée. Merci
NG235
Je crois qu'Apple a présenté une application SwiftUI Mac à la WWDC 2019 avec un contrôle segmenté dans la barre d'outils.
NG235