首页 > 解决方案 > 在 SwiftUI 中更改完成视图

问题描述

我开发了一个管理三个子视图的视图loginregisterconfirm code

现在我正在开发一个单独的视图来管理登录成功后的所有子视图。这个想法是在成功登录后推送新的并弹出旧的。

我已经NavigationLink在登录子视图中尝试过,但它似乎不喜欢isActive其余响应(即完成)的变化。

这是代码:

NavigationLink(
   destination: LoggedView(),
   isActive: self.$pushToLogged,
   label: {
                
   }
).hidden()
func login() {
    let lF = LoginServiceFacade()
    lF.loginMember(mobileNumber: mobileNumber, password: password, completion: {
        (response: LoginResponse?, error: ConnectionErrors?) in
            self.pushToLogged = true
    })
}

标签: iosswiftviewswiftuicompletionhandler

解决方案


这是一个非常简单且易于理解的示例,说明了这样做的可能方式:

首先提供一个包装视图来检查您是否已登录。显示相应的视图:

struct ContentView: View {
    
    @State var isLoggedIn: Bool = false
    
    var body: some View {
        Group() {
            if self.isLoggedIn {
                Home(isLoggedIn: self.$isLoggedIn)
            } else {
                Login(isLoggedIn: self.$isLoggedIn)
            }
        }
    }
}

然后有你的主视图,它可以有你想要的任何结构。例如,我选择一个 TabView:

struct Home: View {
    
    @Binding var isLoggedIn: Bool
    
    var body: some View {
        TabView {
            Example(subTitle: "First")
                .tabItem {
                    Image(systemName: "list.dash")
                    Text("First")
                }

            Example(subTitle: "Second")
                .tabItem {
                    Image(systemName: "square.and.pencil")
                    Text("Second")
                }
        }
    }
}

struct Example: View {
    
    @State var subTitle: String
    
    var body: some View {
        Text("Hello World \(self.subTitle)")
    }
}

完成后的登录视图:

struct Login: View {
    
    @Binding var isLoggedIn: Bool
    
    var myLogin: myLoginClass = myLoginClass()
    
    var body: some View {
        Button(action: {
            self.myLogin.loginWithCompletion { isSucceeded in
                if isSucceeded {
                    self.isLoggedIn.toggle()
                }
            }
        }) {
            Text("Log me in")
        }
    }
}

class myLoginClass {
    // Completing method
    // Here would be your code that would "complete" true if successfully logged in or false if error

    // I'm just waiting to "simulate" the visual process
    func loginWithCompletion(completion: @escaping (Bool) -> Void) {
        DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
            completion(true)
        }
    }
    
}

这产生了这个例子:

以 gif 为例


推荐阅读