Мое приложение поддерживает iOS 15.0, поэтому я не могу использовать NavigationPath
. Итак, я добавил NavigationView
и использовал NavigationLink
для навигации.
Вот мой простой поток приложений.
FirstView -> SecondView -> ThirdView -> ForthView
Я хочу перейти от ForthView к SecondView. Но навигация назад не работает. Вот мой код для того же.
struct FirstView: View {
@State private var isActive: Bool = false
var body: some View {
VStack(spacing: 8) {
Label("Hello, world!", systemImage: "globe")
NavigationLink(destination: SecondView(), isActive: $isActive) {
Button {
isActive = true
} label: {
Text("Second")
}
}
}
.padding()
}
}
struct SecondView: View {
@State private var isActive: Bool = false
var body: some View {
VStack(spacing: 8) {
Text("Hello, World!")
NavigationLink(destination: ThirdView(shouldGoToSecond: $isActive), isActive: $isActive) {
Button {
isActive = true
} label: {
Text("Third")
}
}
}
.navigationTitle("Second")
}
}
struct ThirdView: View {
@Binding var shouldGoToSecond: Bool
@State private var isActive: Bool = false
var body: some View {
VStack {
Text("Hello, World!")
NavigationLink(destination: ForthView(shouldGoToSecond: $shouldGoToSecond), isActive: $isActive) {
Button {
isActive = true
} label: {
Text("Go to Forth")
}
}
}
.navigationTitle("Third")
}
}
struct ForthView: View {
@Binding var shouldGoToSecond: Bool
var body: some View {
VStack {
Text("Hello, World")
Button {
shouldGoToSecond = false
} label: {
Text("Go to Second")
}
}
}
}
Я использую переменную @State
для активации навигационной ссылки и передачи ее следующим представлениям через @Binding
, но она не работает.
Что мне здесь не хватает?
Вы должны использовать
@Environment(\.presentationMode) var presentaionMode
Помните, что Stack Overflow предназначен не только для решения непосредственной проблемы, но и для того, чтобы помочь будущим читателям найти решения похожих проблем, что требует понимания базового кода. Это особенно важно для членов нашего сообщества, которые являются новичками и не знакомы с синтаксисом. Учитывая это, можете ли вы отредактировать свой ответ, включив в него объяснение того, что вы делаете, и почему вы считаете, что это лучший подход?
@MrugeshTank, вы можете использовать глобальный файл наблюдений, изменить флаг и вызвать onReciebved после изменения флага и отклонить его, чтобы представить. Дайте мне знать, если у вас есть это или вам нужно поделиться демо-приложением
@Krishnakushwaha Нужно ли мне обрабатывать навигацию по этому файлу глобального наблюдения?
Вы можете добиться этого, используя isDetailLink
свойство NavigationLink
, когда у вас есть несколько навигаций.
struct FirstView: View {
@State private var isActive: Bool = false
var body: some View {
NavigationView {
VStack(spacing: 8) {
Label("Hello, world!", systemImage: "globe")
NavigationLink(destination: SecondView1(), isActive: $isActive) {
Button {
isActive = true
} label: {
Text("Second")
}
}.isDetailLink(false) //<---
}
.padding()
}
}
}
struct SecondView: View {
@State private var isActive: Bool = false
var body: some View {
VStack(spacing: 8) {
Text("Hello, World!")
NavigationLink(destination: ThirdView(shouldGoToSecond: $isActive), isActive: $isActive) {
Button {
isActive = true
} label: {
Text("Third")
}
}
}
.navigationTitle("Second")
}
}
struct ThirdView: View {
@Binding var shouldGoToSecond: Bool
@State private var isActive: Bool = false
var body: some View {
VStack {
Text("Hello, World!")
NavigationLink(destination: ForthView(shouldGoToSecond: $shouldGoToSecond), isActive: $isActive) {
Button {
isActive = true
} label: {
Text("Go to Forth")
}
}
}
.navigationTitle("Third")
}
}
struct ForthView: View {
@Binding var shouldGoToSecond: Bool
var body: some View {
VStack {
Text("Hello, World")
Button {
shouldGoToSecond = false
} label: {
Text("Go to Second")
}
}
}
}
Не могли бы вы объяснить?
вот несколько шагов для обработки глобальной навигации (не требуется отправлять флаг или привязку)
1
Создайте свой глобальный класс
class Network: NSObject, ObservableObject {
@Published var moveToHome: Bool = false
}
2
где вы хотите извлечь корневой файл, затем измените флаг moveToHome
заставить вас назначить этот класс в вашем классе просмотра, как это
@EnvironmentObject var network: Network
затем измените флаг на своей кнопке или после получения ответа API
self.network.moveToHome = true
3
перейдите в свой домашний класс и вызовите метод onReceive, прежде чем уйти домой, измените флаг в следующий раз
.onReceive(self.network.$moveToHome) { moveToDashboard in
if moveToDashboard {
print("Move to dashboard: \(moveToDashboard)")
self.presentation.wrappedValue.dismiss()
self.network.moveToHome = false
}
}
Примечание. Предположим, что ваш класс Home имеет имя Home или Dashboard, а затем вы переходите к View1, View2, View3, ..... viewN где вы хотите представить Root, измените этот флаг только на этот класс, например, я хочу выскочить после последнего ViewN, затем поставьте этот флаг на ViewN или вы хотите получить root после Third, затем поставьте на Third View3
self.network.moveToHome = true
после этого приходите туда, где у вас есть основной корень, вызовите onReceive того же класса. Предположим, я хочу вернуться к классу Home, а затем включить Receive в View1.... В среднем добавлен один класс -> Home+(Navigate) Вот и все!
надеюсь, что это полезно или дайте мне знать, если у вас есть какие-либо вопросы
Это отлично работает для перехода назад только для одного просмотра. Я хочу вернуться назад на 2 представления. От
ForthView
доSecondView