Vista de pestaña de la aplicación macOS SwiftUI con control segmentado en la barra de herramientas

9

Estoy tratando de crear una aplicación macOS con SwiftUI. Necesito un TabViewo algo similar, pero cuando uso TabViewel control segmentado no está en la barra de herramientas de macOS. Haga clic aquí para ver un ejemplo de lo que me gustaría

Mi código actual es:

import SwiftUI

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

El resultado está aquí como una imagen.

El control segmentado debe estar en la barra de herramientas y no en la vista.

Gracias.

NG235
fuente

Respuestas:

1

Aquí hay una demostración simplificada del posible enfoque para lograr esto. Probado y funciona con Xcode 11.2.

manifestación

1) Prepare la ventana para tener el estilo y el fondo necesarios en 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) Prepare la vista del contenido de la ventana para tener el comportamiento necesario

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
fuente
Gracias por su respuesta. Realmente estoy buscando algo que sea como las aplicaciones de Apple, incluso si está en AppKit. Sin embargo, su respuesta es apreciada. Gracias
NG235
Creo que Apple mostró una aplicación SwiftUI Mac en WWDC 2019 con un control segmentado en la barra de herramientas.
NG235