在 SwiftUI 中更改完成视图

Posted

技术标签:

【中文标题】在 SwiftUI 中更改完成视图【英文标题】:Change view on completion in SwiftUI 【发布时间】:2020-08-31 20:03:37 【问题描述】:

我开发了一个管理三个子视图的视图: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
    )

【问题讨论】:

【参考方案1】:

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

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

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)
        
    
    

这产生了这个例子:

【讨论】:

我不认为你已经回答了这个问题:在 SwiftUI 中更改 completion 的视图。我建议您添加一个示例,如何在完成处理程序中更改 isLoggedIn 是的,你是对的。我太专注于我忘记标题的描述。 我在前面的主题中找到了相同的答案,并将其用于主页视图(登录、注册和确认码)。但是现在我想完全改变登录响应的视图,以获得更简洁的代码。换句话说,我不想要一个管理 15 个子视图的主视图

以上是关于在 SwiftUI 中更改完成视图的主要内容,如果未能解决你的问题,请参考以下文章

值更改时如何在 UIKit 中更新 SwiftUI 视图?

在 SwiftUI 中更改 Text 视图的文本

SwiftUI - 如何在文本视图中更改自定义 SF 符号的颜色?

当 ObservedObject 更改时,在 SwiftUI 视图中未调用 onReceive

如何在 SwiftUI 应用程序生命周期中更改特定视图的状态栏颜色?

有啥方法可以判断哪个状态更改导致在 SwiftUI 中重建视图?