У меня есть три представления в моем проекте - 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.
Пожалуйста, включайте в свой вопрос только соответствующий код... такие вещи, как ваши предварительные просмотры и импорт, не имеют значения и затрудняют ответ на ваш вопрос :)
@loremipsum Это работает, если все представления находятся в одном файле swiftUi.
@Stoic Я понял, позабочусь.
У вас не должно быть нескольких 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.
@UdayChaudhary Смотрите мое обновление - часто в предварительных просмотрах вы должны указать значения .constant
для Binding
, которые, как ожидается, будут переданы.
Еще одна вещь, если вы можете мне помочь. Когда я нахожусь в SecondView swiftUiFile и нажимаю кнопку «Это второй вид», ничего не происходит.
Вы про Превью?
да в превью
Если вы хотите, чтобы Навигация работала в предварительном просмотре (что, вероятно, не то, что вам действительно нужно - предварительный просмотр обычно должен быть для тестирования одного представления). Вам нужно будет включить логику NavigationStack
(включая .navigationDestination
) в свой код Preview
. Я рекомендую вам не делать этого и использовать предварительный просмотр для предварительного просмотра одного представления. Или, если вы действительно хотите это сделать, используйте предварительный просмотр ContentView
и передайте явный path
, который приведет вас к SecondView
Отвечает ли это на ваш вопрос? Для стека навигации с однородным путем эффективны только пункты навигации корневого уровня