繁体   English   中英

SwiftUI:更改视图并删除父级

[英]SwiftUI: Change view and remove parent

我有一个带有NavigationLink的视图。 NavigationLink是一个“注销”按钮,因此当用户单击此按钮时,我不希望他们能够单击NavigationBar中的"Back"按钮。 有没有办法以编程方式更改视图并删除“父”视图。

这是带有注销按钮的视图:

struct SettingsView: View {

    @State private var didLogout: Bool = false
    
    var body: some View {
        NavigationView {
            VStack {
                NavigationLink(destination: Login(), isActive: $didLogout) {
                    Button(action: {
                        //logout code here
                        self.didLogout = true
                    }) {
                        Text("Logout")
                    }
                }
            }
        }
    }
}

这是登录视图(我在用户注销时推送到的视图):

struct Login: View {
    
    //Login states
    @State var isActive = false
    @State var attemptingLogin = false
    @State var didLoginFail = false
    
    var body: some View {
        
        NavigationView {
            VStack {
                if (attemptingLogin == true) {
                    ProgressView()
                        .progressViewStyle(CircularProgressViewStyle())
                }
                
                NavigationLink(destination: blah(), isActive: $isActive) {
                    Button(action: {
                        attemptingLogin = true
                        blah.Login() { didLogin in
                            if didLogin == true {
                                self.isActive = true
                            } else {
                                self.isActive = false
                                self.didLoginFail = true
                                self.attemptingLogin = false
                            }
                        }
                    }) {
                        Text("Login")
                    }
                }        
            }.padding()
        }
    }
}

我删除了一些问题不需要的代码。 任何帮助将不胜感激,因为我在网上找不到任何关于这个问题的东西。 我觉得我的查询措辞不正确,因为我确信很多人在使用 SwiftUI 之前遇到过这个问题。

就像我说的,如果有办法“忘记” NavigationView 的历史,并将其视为堆栈中的顶视图?

SO上有关于“pop to top”或“pop to root”的各种问题和答案,这可能是您正在寻找的:

但是,另一种常见的模式是根据您是否登录有条件地显示您的NavigationView 这可能看起来像这样:

class StateManager : ObservableObject {
    @Published private(set) var isLoggedIn = false
    
    func changeLogin(state: Bool) {
        withAnimation {
            isLoggedIn = state
        }
    }
}

struct ContentView: View {
    @StateObject var stateManager = StateManager()
    
    var body: some View {
        if stateManager.isLoggedIn {
            LoggedInView(stateManager: stateManager)
                .transition(.slide)
        } else {
            LoginView(stateManager: stateManager)
                .transition(.slide)
        }
    }
}

struct LoginView : View {
    @ObservedObject var stateManager : StateManager
    
    var body: some View {
        Button("Log in") {
            stateManager.changeLogin(state: true)
        }
    }
}

struct LoggedInView : View {
    @ObservedObject var stateManager : StateManager
    
    var body: some View {
        NavigationView {
            Button("Log out") {
                stateManager.changeLogin(state: false)
            }.navigationBarTitle("Logged in")
        }
    }
}

到目前为止我所看到的,这不是一个好习惯,通常是一个好的逻辑 storyboard 设计从启动屏幕开始,然后在您进入应用程序时被登录或注册屏幕取代,您推送到标签栏或侧边栏屏幕您的主菜单或根菜单及其每个项目都嵌入在导航视图中,以推送到内部视图并从它们弹出到 go 回来。 如果你不隐藏和显示navigationView会更好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM