如何解决有没有更好的方法可以通过根视图打开另一个视图?
我想通过View2Test
从View3Test
导航到RouterTest
。
我以解决问题的方式编写了演示代码。
我的问题是为什么我需要使用DispatchQueue.main.asyncAfter(deadline: .now() + 0.5)
来防止View3Test
打开后关闭,还是有更好的方法?
import SwiftUI
class RouterStore: ObservableObject {
static let shared = RouterStore()
@Published var showView1: Bool = false
@Published var showView3: Bool = false
}
struct RouterTest: View {
@ObservedObject var store = RouterStore.shared
var body: some View {
NavigationView {
VStack {
Text("RouterTest")
Button(
action: { self.store.showView1 = true },label: { Text("Go to View1") }
)
NavigationLink(
destination: LazyView {
View3Test()
},isActive: $store.showView3,label: { EmptyView() }
)
NavigationLink(
destination: LazyView {
View1Test()
},isActive: $store.showView1,label: { EmptyView() }
)
.isDetailLink(false)
.onDisappear {
print("RouterTest onDisappear NavigationLink")
}
}
}
.onDisappear {
print("RouterTest onDisappear")
}
}
}
struct View1Test: View {
@ObservedObject var store = RouterStore.shared
var body: some View {
VStack {
Text("View1Test")
NavigationLink(
destination: LazyView {
View2Test()
},label: { Text("Go to View2") }
)
}
}
}
struct View2Test: View {
@ObservedObject var store = RouterStore.shared
var body: some View {
VStack {
Text("View2Test")
Button(
action: {
self.store.showView1 = false
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
self.store.showView3 = true
}
},label: { Text("Go to RouterTest") }
)
}
}
}
struct View3Test: View {
@ObservedObject var store = RouterStore.shared
var body: some View {
VStack {
Text("View3Test")
}
}
}
没有DispatchQueue.main.asyncAfter(deadline: .now() + 0.5)
解决方法
有更好的方法。我将self.store.showView3 = true
移至View2Test. onDisappear
是因为View2Test. onDisappear
在RouterTest.onAppear
之后被调用
//
// RouterTest.swift
// Traning2
//
// Created by Viktor Kushnerov on 8/26/20.
// Copyright © 2020 Viktor Kushnerov. All rights reserved.
//
import SwiftUI
class RouterStore: ObservableObject {
static let shared = RouterStore()
@Published var showView1: Bool = false
@Published var showView3: Bool = false
}
struct RouterTest: View {
@ObservedObject var store = RouterStore.shared
var body: some View {
NavigationView {
VStack {
Text("RouterTest")
Button(
action: { self.store.showView1 = true },label: { Text("Go to View1") }
)
NavigationLink(
destination: LazyView {
View3Test()
},isActive: $store.showView3,label: { EmptyView() }
)
NavigationLink(
destination: LazyView {
View1Test()
},isActive: $store.showView1,label: { EmptyView() }
)
.isDetailLink(false)
.onDisappear {
print("RouterTest onDisappear NavigationLink")
}
}
}
.onDisappear {
print("RouterTest onDisappear")
}
}
}
struct View1Test: View {
@ObservedObject var store = RouterStore.shared
var body: some View {
VStack {
Text("View1Test")
NavigationLink(
destination: LazyView {
View2Test()
},label: { Text("Go to View2") }
)
}
}
}
struct View2Test: View {
@ObservedObject var store = RouterStore.shared
var body: some View {
VStack {
Text("View2Test")
Button(
action: {
self.store.showView1 = false
},label: { Text("Go to RouterTest") }
)
}
.onDisappear {
self.store.showView3 = true
}
}
}
struct View3Test: View {
@ObservedObject var store = RouterStore.shared
var body: some View {
VStack {
Text("View3Test")
}
}
}
struct RouterTest_Previews: PreviewProvider {
static var previews: some View {
RouterTest()
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。