首页 > 解决方案 > 组合:如何仅在用户输入后验证文本字段

问题描述

我是 Swift 编程的新手。尝试使用非空验证的用户名和密码字段构建登录页面

这是使用 Combine 进行验证的代码:

private var isUsernameValid: AnyPublisher<Bool, Never> {
        $username
            .debounce(for: 0.2, scheduler: RunLoop.main)
            .removeDuplicates()
            .map {
                if $0.isEmpty {
                self.errorUsername = "Invalid Username"
                return false
            } else {
                self.errorUsername = ""
                return true
            } }
            .eraseToAnyPublisher()
    }
    
    private var isPasswordValid: AnyPublisher<Bool, Never> {
        $password
            .debounce(for: 0.2, scheduler: RunLoop.main)
            .removeDuplicates()
            .map {
                if $0.isEmpty {
                self.errorPassword = "Invalid Password"
                return false
            } else {
                self.errorPassword = ""
                return true
            } }
            .eraseToAnyPublisher()
    }
    
    private var isFormValid: AnyPublisher<Bool, Never> {
        Publishers.CombineLatest(isUsernameValid, isPasswordValid)
            .debounce(for: 0.2, scheduler: RunLoop.main)
            .map { $0 && $1 }
            .eraseToAnyPublisher()
    }

一旦我进入登录页面,就会显示错误消息。我只想在用户开始输入文本字段后显示验证错误。请帮忙

标签: swiftvalidationcombine

解决方案


您可以使用.dropFirst()来摆脱初始值(即空字段)。

$username
  .dropFirst()
  .debounce(for: 0.2, scheduler: RunLoop.main)

.dropFirst还可以在调用发布者链的其余部分之前使用Int参数来删除x值的数量,这通常很有用。


推荐阅读