结合:如何仅在用户输入后验证文本字段

Combine: How to validate textfields only after user input

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

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

private var isUsernameValid: AnyPublisher<Bool, Never> {
        $username
            .debounce(for: 0.2, scheduler: RunLoop.main)
            .removeDuplicates()
            .map {
                if [=10=].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 [=10=].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 { [=10=] &&  }
            .eraseToAnyPublisher()
    }

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

您可以使用.dropFirst()去掉初始值(即空字段)。

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

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