结合:如何仅在用户输入后验证文本字段
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
个值,这通常很有用。
我是 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
个值,这通常很有用。