Пользовательская кнопка возврата для навигационной панели NavigationView в SwiftUI - PullRequest
5 голосов
/ 13 июня 2019

Я хочу добавить пользовательскую кнопку навигации, которая будет выглядеть примерно так:

desired navigation back button

Теперь я написал для этого BackButton. При применении этого представления в качестве ведущего элемента панели навигации выполните:

.navigationBarItems(leading: BackButton())

... вид навигации выглядит следующим образом:

current navigation back button

Я играл с такими модификаторами, как:

.navigationBarItem(title: Text(""), titleDisplayMode: .automatic, hidesBackButton: true)

без удачи.

Вопрос

Как я могу ...

  1. установить вид, используемый в качестве пользовательской кнопки возврата на панели навигации? ИЛИ:
  2. программно вернуть представление назад к его родителю?
    При таком подходе я мог полностью скрыть панель навигации, используя .navigationBarHidden(true)

1 Ответ

1 голос
/ 12 июля 2019

Я нашел это: https://ryanashcraft.me/swiftui-programmatic-navigation/

Это работает, и это может заложить основу для конечного автомата, чтобы контролировать то, что показывает, но это не так просто, как это было раньше.

import Combine
import SwiftUI

struct DetailView: View {
    var onDismiss: () -> Void

    var body: some View {
        Button(
            "Here are details. Tap to go back.",
            action: self.onDismiss
        )
    }
}

struct RootView: View {
    var link: NavigationDestinationLink<DetailView>
    var publisher: AnyPublisher<Void, Never>

    init() {
        let publisher = PassthroughSubject<Void, Never>()
        self.link = NavigationDestinationLink(
            DetailView(onDismiss: { publisher.send() }),
            isDetail: false
        )
        self.publisher = publisher.eraseToAnyPublisher()
    }

    var body: some View {
        VStack {
            Button("I am root. Tap for more details.", action: {
                self.link.presented?.value = true
            })
        }
            .onReceive(publisher, perform: { _ in
                self.link.presented?.value = false
            })
    }
}

struct ContentView: View {
    var body: some View {
        NavigationView {
            RootView()
        }
    }
}

If you want to hide the button then you can replace the DetailView with this:

struct LocalDetailView: View {
    var onDismiss: () -> Void

    var body: some View {
        Button(
            "Here are details. Tap to go back.",
            action: self.onDismiss
        )
            .navigationBarItems(leading: Text(""))
    }
}
...