Я не могу углубиться в представления в Swiftui

У меня есть три представления в моем проекте - ContentView, SecondView, ThirdView

Я хочу перейти от contentView к secondView и secondView к ThirdView.

КонтентВью: -

import SwiftUI

struct ContentView: View {
    @State private var path = NavigationPath()
    
    var body: some View {
        NavigationStack(path: $path) {
            Button {
                path.append("SecondView")
            } label: {
                Text("This is the first view")
                
            }
            .navigationDestination(for: String.self) { view2 in
                if view2 == "SecondView" {
                 SecondView()
                }
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

Второй вид: -

import SwiftUI

struct SecondView: View {
    @State private var path = NavigationPath()
    var body: some View {
        NavigationStack(path: $path) {
            Button {
                path.append("ThirdView")
            } label: {
                Text("This is the second view")
                
            }
            .navigationDestination(for: String.self) { view2 in
                if view2 == "ThirdView" {
                 ThirdView()
                }
            }
        }
    }
}

struct SecondView_Previews: PreviewProvider {
    static var previews: some View {
        NavigationStack {
            SecondView()
        }
    }
}

Третий вид: -


import SwiftUI

struct ThirdView: View {
    var body: some View {
        Text("This is the third view")
    }
}

struct ThirdView_Previews: PreviewProvider {
    static var previews: some View {
        NavigationStack {
            ThirdView()
        }
    }
}

Что случилось :-

Всякий раз, когда я нажимаю кнопку «Это первое представление» в своем ContentView, я перехожу к SecondView и автоматически возвращаюсь к contentView.

Что я хочу :-

Я хочу перейти от contentView к secondView и secondView к ThirdView.

Пожалуйста, включайте в свой вопрос только соответствующий код... такие вещи, как ваши предварительные просмотры и импорт, не имеют значения и затрудняют ответ на ваш вопрос :)

Stoic 20.11.2022 21:15

@loremipsum Это работает, если все представления находятся в одном файле swiftUi.

Uday Chaudhary 20.11.2022 21:38

@Stoic Я понял, позабочусь.

Uday Chaudhary 20.11.2022 21:41
Шаблоны Angular PrimeNg
Шаблоны Angular PrimeNg
Как привнести проверку типов в наши шаблоны Angular, использующие компоненты библиотеки PrimeNg, и настроить их отображение с помощью встроенной...
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Если вы веб-разработчик (или хотите им стать), то вы наверняка гик и вам нравятся "Звездные войны". А как бы вы хотели, чтобы фоном для вашего...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Начала с розового дизайна
Начала с розового дизайна
Pink Design - это система дизайна Appwrite с открытым исходным кодом для создания последовательных и многократно используемых пользовательских...
Шлюз в PHP
Шлюз в PHP
API-шлюз (AG) - это сервер, который действует как единая точка входа для набора микросервисов.
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
1
4
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

У вас не должно быть нескольких NavigationStack в иерархии. У вас должен быть один и передать path через Binding.

struct ContentView: View {
    @State private var path = NavigationPath()
    
    var body: some View {
        NavigationStack(path: $path) {
            Button {
                path.append("SecondView")
            } label: {
                Text("This is the first view")
                
            }
            .navigationDestination(for: String.self) { view in
                switch view {
                case "SecondView":
                    SecondView(path: $path)
                case "ThirdView":
                    ThirdView()
                default:
                    Text("Unknown")
                }
            }
        }
    }
}

struct SecondView: View {
    @Binding var path: NavigationPath
    var body: some View {
        Button {
            path.append("ThirdView")
        } label: {
            Text("This is the second view")
            
        }
    }
}

struct ThirdView: View {
    var body: some View {
        Text("This is the third view")
    }
}

struct SecondView_Previews: PreviewProvider {
    static var previews: some View {
        NavigationStack {
            SecondView(path: .constant(NavigationPath()))
        }
    }
}

Я не могу предварительно просмотреть файл secondView swiftUiFile, ошибка говорит: - отсутствует аргумент для параметра «путь» в вызове. Примечание. Я использую разные файлы swiftui.

Uday Chaudhary 20.11.2022 21:27

@UdayChaudhary Смотрите мое обновление - часто в предварительных просмотрах вы должны указать значения .constant для Binding, которые, как ожидается, будут переданы.

jnpdx 20.11.2022 21:29

Еще одна вещь, если вы можете мне помочь. Когда я нахожусь в SecondView swiftUiFile и нажимаю кнопку «Это второй вид», ничего не происходит.

Uday Chaudhary 20.11.2022 21:37

Вы про Превью?

jnpdx 20.11.2022 21:38

да в превью

Uday Chaudhary 20.11.2022 21:40

Если вы хотите, чтобы Навигация работала в предварительном просмотре (что, вероятно, не то, что вам действительно нужно - предварительный просмотр обычно должен быть для тестирования одного представления). Вам нужно будет включить логику NavigationStack (включая .navigationDestination) в свой код Preview. Я рекомендую вам не делать этого и использовать предварительный просмотр для предварительного просмотра одного представления. Или, если вы действительно хотите это сделать, используйте предварительный просмотр ContentView и передайте явный path, который приведет вас к SecondView

jnpdx 20.11.2022 21:42

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