SwiftUI2弹出到没有场景委托的根视图
我想在用户注销时刷新根视图,但在新的无场景 SwiftUi 2 下找不到如何执行此操作。
接下来是@Swissmark发布的解决方案,我试图在 SwiftUI 2 中实现:
let contentView = AppRootView(showingView: ShowingView(showingView: appStartView))
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: contentView)
self.window = window
window.makeKeyAndVisible()
}
回答
一个可能的解决方案是创建一个ObservableObject负责路由的:
enum AppView {
case login, main
}
class ViewRouter: ObservableObject {
// here you can decide which view to show at launch
@Published var currentView: AppView = .login
}
然后,您可以将其ViewRouter作为EnvironmentObject根视图注入:
@main
struct TestApp: App {
@StateObject private var viewRouter = ViewRouter()
var body: some Scene {
WindowGroup {
RootView()
.environmentObject(viewRouter)
}
}
}
现在您可以从任何视图更改当前视图:
struct RootView: View {
@EnvironmentObject private var viewRouter: ViewRouter
var body: some View {
VStack {
if viewRouter.currentView == .login {
LoginView()
} else if viewRouter.currentView == .main {
MainView()
}
}
}
}
struct LoginView: View {
@EnvironmentObject private var viewRouter: ViewRouter
var body: some View {
VStack {
Text("Login View")
Button("Log in") {
viewRouter.currentView = .main
}
}
}
}
struct MainView: View {
@EnvironmentObject private var viewRouter: ViewRouter
var body: some View {
VStack {
Text("Main View")
Button("Log out") {
viewRouter.currentView = .login
}
}
}
}