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
            }
        }
    }
}


以上是SwiftUI2弹出到没有场景委托的根视图的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>