Widok karty aplikacji macOS SwiftUI z segmentowanym sterowaniem na pasku narzędzi

9

Próbuję utworzyć aplikację macOS za pomocą SwiftUI. Potrzebuję TabViewczegoś podobnego, ale kiedy używam TabViewsegmentowej kontrolki, nie ma jej na pasku narzędzi macOS. Kliknij tutaj, aby zobaczyć przykład tego, co chciałbym

Mój obecny kod to:

import SwiftUI

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

Wynik jest tutaj jako obraz

Sterowanie segmentowe musi znajdować się na pasku narzędzi, a nie w widoku.

Dziękuję Ci.

NG235
źródło

Odpowiedzi:

1

Oto uproszczone demo możliwego podejścia do osiągnięcia tego celu. Testowane i współpracuje z Xcode 11.2.

próbny

1) Przygotuj okno, aby mieć potrzebny styl i tło 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) Przygotuj widok zawartości okna, aby uzyskać wymagane zachowanie

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
źródło
Dziękuję za Twoją odpowiedź. Naprawdę szukam czegoś, co przypomina aplikacje Apple, nawet jeśli jest w AppKit. Twoja odpowiedź jest jednak mile widziana. Dzięki
NG235
Wierzę, że Apple pokazało aplikację SwiftUI Mac na WWDC 2019 z segmentowanym sterowaniem na pasku narzędzi.
NG235