【问题标题】:Why does this navigation link not work as expected?为什么此导航链接无法按预期工作?
【发布时间】:2021-08-04 21:03:31
【问题描述】:

我尝试在 swift 5 中实现登录屏幕,但登录导航链接似乎没有从我的视图模型中检查 isActive 变量。当我第一次单击它时,它会引导我进入下一个视图,尽管登录数据不正确。当我回去尝试再次登录时,它会检查数据。

登录视图:

import SwiftUI

struct LoginView: View {

@ObservedObject var viewModel: LoginViewModel

var username_text_field: some View {
    TextField("Username", text: $viewModel.username)
}

var password_secure_field: some View {
    SecureField("Password", text: $viewModel.password)
}

var login_button: some View {
    
    NavigationLink(
        destination: MenuView(),
        isActive: $viewModel.is_valid
    ) {
        Text("LOGIN").onTapGesture {
            viewModel.login()
        }
    }
}

var body: some View {
    
    NavigationView {
        
        VStack {
            Group {
                username_text_field
                password_secure_field
                login_button
            } 
        }
    }
}
}

登录视图模型:

import SwiftUI

final class LoginViewModel: ObservableObject {

@Published var username = ""
@Published var password = ""
@Published var is_valid = false

func login() {
    self.is_valid = false
}
}

这种方法有问题还是我遗漏了什么?

【问题讨论】:

    标签: swift mvvm swiftui


    【解决方案1】:

    您使用的是哪个 Xcode 版本?我使用的是 iOS 14.5 版本 12.5 (12E262),您的代码运行良好。但是,您可能希望将LOGIN 按钮移到NavigationLink 之外,以保证它仅根据isActive 触发

    var login_button: some View {
        Button {
            viewModel.login()
        } label: {
            Text("LOGIN")
        }
    }
    
    NavigationView {
        
        VStack {
            Group {
                username_text_field
                password_secure_field
                login_button
                
                NavigationLink(
                    destination: Text("Menu View"),
                    isActive: $viewModel.is_valid
                ) { EmptyView() } /// pass in `EmptyView`
            }
        }
    }
    

    旧答案:

    login() 更改为:

    func login() {
        self.is_valid = true /// true, not false!
    }
    

    你也应该在 Swift 中使用驼峰式大小写,所以 self.isValid 而不是 self.is_valid

    【讨论】:

    • 在登录功能中,我会检查凭据,如果它们有效,我会将 is_valid 设置为 true。我只将它设置为 false 进行测试 - 这意味着数据不匹配并且登录不应该工作(但它确实)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 2018-04-09
    • 1970-01-01
    相关资源
    最近更新 更多