Закрыть представление и отправить в стек навигации SwiftUI

У меня все приложение завернуто в NavigationView, и я пытаюсь продублировать переход в коротком видео, указанном ниже. Судя по тому, что я вижу, похоже, что они представляют fullScreenCover, и когда ссылка нажимается, она отклоняет fullScreenCover и помещает все, что было нажато, в стек навигации после завершения отклонения.

Пример видео

У меня на данный момент это...

@Environment(\.dismiss) var dismiss
ScrollView {
    VStack {
        ForEach(viewModel.searchResults, id: \.self) { bottle in
            NavigationLink(destination: BottleDetailView(bottle: bottle)) {
                BottleCell(bottle: bottle) <-- tapping this would dismiss fullscreenCover and push this NavigationLink into the NavigationStack of my app
            }
        }
    }
}

Я попытался встроить другой навигационный вид в полноэкранный режим, но это даже не близко к дублированию перехода выше. Как я могу продублировать это?

ваша ссылка на видео битая

ChrisR 10.01.2023 23:07

@ChrisR Исправлено. Извини за это.

Trenton 10.01.2023 23:15
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать программно управляемый NavigationStack. В fullscreenCover сначала закройте, затем подождите, пока он исчезнет, ​​затем установите пункт назначения навигации.

Вот полный пример:

struct ContentView: View {
    
    @State private var search = ""
    @State private var showSheet = false
    
    // programmatically controllable Navigation Stack
    @State private var path = [Int]()

    var body: some View {
        NavigationStack(path: $path) {
            VStack {
                searchField
                    .disabled(true)
                    .onTapGesture {
                        showSheet = true
                    }
                
                Spacer()
                Text("Other stuff")
                Spacer()
                
            }
            .padding()
            .navigationTitle("Find something")
            
            .fullScreenCover(isPresented: $showSheet) {
                fullscreenSheet
            }
            
            // this defines the destination(s) for the programatically activated navigation stack
            .navigationDestination(for: Int.self) { value in
                Text("Detail View for Result \(value)")
            }
            
        }
    }
    
    
    var fullscreenSheet: some View {
        VStack(alignment: .leading, spacing: 30) {
            HStack {
                searchField
                Button("Cancel") { showSheet = false }
            }
            
            // dummy search results
            ForEach(1..<6) { result in
                Button("Result \(result) >") {
                    // dismiss sheet
                    showSheet = false
                    // wait and trigger navigation
                    Task {
                        try await Task.sleep(for: .seconds(0.1))
                        self.path = [result]
                    }
                }
            }
            Spacer()
        }
        .padding()
    }

    
    var searchField: some View {
        HStack {
            Image(systemName: "magnifyingglass")
                .foregroundColor(.white)
            TextField("", text: $search,
                      prompt: Text("What are you looking for?")
                .foregroundColor(.white)
            )
        }
        .padding()
        .background(
            Capsule().fill(.gray)
        )
    }
    
}

Другие вопросы по теме