【问题标题】:SwiftUI: Change view and remove parentSwiftUI:更改视图并删除父级
【发布时间】:2021-07-19 05:21:29
【问题描述】:

我有一个带有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 的历史,并将其视为堆栈中的顶部视图?

【问题讨论】:

    标签: ios swift swiftui navigationview


    【解决方案1】:

    这里有关于“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")
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-02
        • 1970-01-01
        相关资源
        最近更新 更多