Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
4.2k views
in Technique[技术] by (71.8m points)

swift - SwiftUI 2 pop to root view with no Scene delegate

I would like to refresh root view when user logs out but I can’t find how to do it under the new Scene-less SwiftUi 2.

Next is @Swissmark posted solution I'm trying to implement in 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()
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

A possible solution is to create an ObservableObject that is responsible for routing:

enum AppView {
    case login, main
}

class ViewRouter: ObservableObject {
    // here you can decide which view to show at launch
    @Published var currentView: AppView = .login
}

Then, you can inject this ViewRouter as an EnvironmentObject to the root view:

@main
struct TestApp: App {
    @StateObject private var viewRouter = ViewRouter()
    
    var body: some Scene {
        WindowGroup {
            RootView()
                .environmentObject(viewRouter)
        }
    }
}

Now you can change the current view from any view:

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...