检查 UITextField 是否为空的优雅方法
Elegant way to check if UITextField is empty
我目前正在做一个项目,我使用了很多 UITextField
s。为了验证,我需要检查 UITextField
是否为空。我有一个可行的解决方案,但它并不那么优雅。也许有人知道更好的方法。
这是我的解决方案:
// Check if text field is empty
if let text = textField.text, !text.isEmpty {
// Text field is not empty
} else {
// Text field is empty
}
有没有不展开文本字段的文本属性来查明它是否为空的更快的方法?
谢谢!
如果您有多个要检查的文本字段,可以将它们全部放在一个 guard 语句中
guard let text1 = textField1.text, let text2 = textField2.text, let text3 = textField3.text, !text1.isEmpty, !text2.isEmpty, !text3.isEmpty else {
//error handling
return
}
//Do stuff
如何扩展 UITextField
…
extension UITextField {
var isEmpty: Bool {
if let text = textField.text, !text.isEmpty {
return false
}
return true
}
}
那么……
if myTextField.isEmpty {
}
我想根据用户应提供的内容验证每个文本字段, 即 emailTextField
应包含有效的电子邮件地址等。虽然 Ashley Mills 答案很方便,如果您将空格 " "
视为文本,这将 return false.
在您的情况下,由于您需要以相同的方式验证多个文本字段,为什么不像 Ashley 那样扩展 UITextField
,使用静态 class 方法可以验证作为一个数组,除此之外还有针对每种类型的文本字段的其他验证方法。我学会了使用 guard
而不是 returning 布尔值。这样 guard let
可用于检查验证是否失败(为 nil)并执行正确的代码,例如向用户显示提示,否则继续执行。
UITextFieldExtension.swift
import Foundation
import UIKit
extension UITextField {
/// Validates all text field are non-nil and non-empty, Returns true if all fields pass.
/// - Returns: Bool
static func validateAll(textFields:[UITextField]) -> Bool {
// Check each field for nil and not empty.
for field in textFields {
// Remove space and new lines while unwrapping.
guard let fieldText = field.text?.trimmingCharacters(in: .whitespacesAndNewlines) else {
return false
}
// Are there no other charaters?
if (fieldText.isEmpty) {
return false
}
}
// All fields passed.
return true
}
//A function that validates the email address...
func validateEmail(field: UITextField) -> String? {
guard let trimmedText = field.text?.trimmingCharacters(in: .whitespacesAndNewlines) else {
return nil
}
//email addresses are automatically detected as links in i0S...
guard let dataDetector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue) else {
return nil
}
let range = NSMakeRange(0, NSString(string: trimmedText).length)
let allMatches = dataDetector.matches(in: trimmedText,
options: [],
range: range)
if allMatches.count == 1,
allMatches.first?.url?.absoluteString.contains("mailto:") == true
{
return trimmedText
}
return nil
}
func validateUserName(field: UITextField) -> String? {
guard let text:String = field.text else {
return nil
}
/* 3 to 12 characters, no numbers or special characters */
let RegEx = "^[^\d!@#£$%^&*<>()/\\~\[\]\{\}\?\_\.\`\'\,\:\;|\"+=-]+$"
let Test = NSPredicate(format:"SELF MATCHES %@", RegEx)
let isValid = Test.evaluate(with: text)
if (isValid) {
return text
}
return nil
}
/*6 to 16 Characters */
func validatePassword(field: UITextField) -> String?{
guard let text:String = field.text else {
return nil
}
/*6-16 charaters, and at least one number*/
let RegEx = "^(?=.*\d)(.+){6,16}$"
let Test = NSPredicate(format:"SELF MATCHES%@", RegEx)
let isValid = Test.evaluate(with: text)
if (isValid) {
return text
}
return nil
}
}
同时,其他地方...
if (UITextField.validateAll(textFields: [emailTextField, nameTextField])) {
// Do something
}
您可以使用 UIKeyInput property hasText。它适用于 UITextField 和 UITextView:
if textField.hasText {
// Text field is not empty
} else {
// Text field is empty
}
如果您想检查文本是否不仅包含空格:
extension UITextField {
var isEmpty: Bool {
return text?.trimmingCharacters(in: .whitespacesAndNewlines) == ""
}
}
let tf = UITextField()
tf.text = " \n \n "
tf.isEmpty // true
我目前正在做一个项目,我使用了很多 UITextField
s。为了验证,我需要检查 UITextField
是否为空。我有一个可行的解决方案,但它并不那么优雅。也许有人知道更好的方法。
这是我的解决方案:
// Check if text field is empty
if let text = textField.text, !text.isEmpty {
// Text field is not empty
} else {
// Text field is empty
}
有没有不展开文本字段的文本属性来查明它是否为空的更快的方法?
谢谢!
如果您有多个要检查的文本字段,可以将它们全部放在一个 guard 语句中
guard let text1 = textField1.text, let text2 = textField2.text, let text3 = textField3.text, !text1.isEmpty, !text2.isEmpty, !text3.isEmpty else {
//error handling
return
}
//Do stuff
如何扩展 UITextField
…
extension UITextField {
var isEmpty: Bool {
if let text = textField.text, !text.isEmpty {
return false
}
return true
}
}
那么……
if myTextField.isEmpty {
}
我想根据用户应提供的内容验证每个文本字段, 即 emailTextField
应包含有效的电子邮件地址等。虽然 Ashley Mills 答案很方便,如果您将空格 " "
视为文本,这将 return false.
在您的情况下,由于您需要以相同的方式验证多个文本字段,为什么不像 Ashley 那样扩展 UITextField
,使用静态 class 方法可以验证作为一个数组,除此之外还有针对每种类型的文本字段的其他验证方法。我学会了使用 guard
而不是 returning 布尔值。这样 guard let
可用于检查验证是否失败(为 nil)并执行正确的代码,例如向用户显示提示,否则继续执行。
UITextFieldExtension.swift
import Foundation
import UIKit
extension UITextField {
/// Validates all text field are non-nil and non-empty, Returns true if all fields pass.
/// - Returns: Bool
static func validateAll(textFields:[UITextField]) -> Bool {
// Check each field for nil and not empty.
for field in textFields {
// Remove space and new lines while unwrapping.
guard let fieldText = field.text?.trimmingCharacters(in: .whitespacesAndNewlines) else {
return false
}
// Are there no other charaters?
if (fieldText.isEmpty) {
return false
}
}
// All fields passed.
return true
}
//A function that validates the email address...
func validateEmail(field: UITextField) -> String? {
guard let trimmedText = field.text?.trimmingCharacters(in: .whitespacesAndNewlines) else {
return nil
}
//email addresses are automatically detected as links in i0S...
guard let dataDetector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue) else {
return nil
}
let range = NSMakeRange(0, NSString(string: trimmedText).length)
let allMatches = dataDetector.matches(in: trimmedText,
options: [],
range: range)
if allMatches.count == 1,
allMatches.first?.url?.absoluteString.contains("mailto:") == true
{
return trimmedText
}
return nil
}
func validateUserName(field: UITextField) -> String? {
guard let text:String = field.text else {
return nil
}
/* 3 to 12 characters, no numbers or special characters */
let RegEx = "^[^\d!@#£$%^&*<>()/\\~\[\]\{\}\?\_\.\`\'\,\:\;|\"+=-]+$"
let Test = NSPredicate(format:"SELF MATCHES %@", RegEx)
let isValid = Test.evaluate(with: text)
if (isValid) {
return text
}
return nil
}
/*6 to 16 Characters */
func validatePassword(field: UITextField) -> String?{
guard let text:String = field.text else {
return nil
}
/*6-16 charaters, and at least one number*/
let RegEx = "^(?=.*\d)(.+){6,16}$"
let Test = NSPredicate(format:"SELF MATCHES%@", RegEx)
let isValid = Test.evaluate(with: text)
if (isValid) {
return text
}
return nil
}
}
同时,其他地方...
if (UITextField.validateAll(textFields: [emailTextField, nameTextField])) {
// Do something
}
您可以使用 UIKeyInput property hasText。它适用于 UITextField 和 UITextView:
if textField.hasText {
// Text field is not empty
} else {
// Text field is empty
}
如果您想检查文本是否不仅包含空格:
extension UITextField {
var isEmpty: Bool {
return text?.trimmingCharacters(in: .whitespacesAndNewlines) == ""
}
}
let tf = UITextField()
tf.text = " \n \n "
tf.isEmpty // true