问题
I am trying to make all of my text fields required to make sure that users does not leave it empty. I tried this but for some reason it's not working. I feel like my logic is correct, but it's an issue with swift's logic
Here is my code:
let title = txtTitle.text!
let location = txtWhere.text!
let when = txtWhen.text!
if title != nil && location != nil && when != nil {
var titleArray = [String]()
var whereArray = [String]()
var whenArray = [String]()
let titleObject = UserDefaults.standard.object(forKey: "saveTitle")
let whereObject = UserDefaults.standard.object(forKey: "saveLocation")
let whenObject = UserDefaults.standard.object(forKey: "saveWhen")
if let tempTitle = titleObject as? [String] {
titleArray = tempTitle
titleArray.append(txtTitle.text!)
print(titleArray)
}
else {
titleArray = [txtTitle.text!]
}
if let tempWhere = whereObject as? [String] {
whereArray = tempWhere
whereArray.append(txtWhere.text!)
//print(titleArray)
}
else {
whereArray = [txtWhere.text!]
}
if let tempWhen = whenObject as? [String] {
whenArray = tempWhen
whenArray.append(txtWhen.text!)
//print(titleArray)
}
else {
whenArray = [txtWhen.text!]
}
UserDefaults.standard.set(titleArray, forKey: "saveTitle")
UserDefaults.standard.set(whereArray, forKey: "saveLocation")
UserDefaults.standard.set(whenArray, forKey: "saveWhen")
txtTitle.text = ""
txtWhere.text = ""
txtWhen.text = ""
txtTime.text = ""
}
else
{
errMsg.isHidden = false
errMsg.text = "All fields are required"
}
}
回答1:
To check reliably if the text
properties of the text fields are not nil
and not empty use
if let title = txtTitle.text, !title.isEmpty,
let location = txtWhere.text, !location.isEmpty,
let when = txtWhen.text, !when.isEmpty { ...
If all conditions are passed the three variables are safely unwrapped.
回答2:
a. You shouldn't force unwrap (txtTitle.text!
): instead check the optional value
b. You may want to check for empty strings instead of just for nil
That said, you can test for validity like that:
let title = txtTitle.text
if title?.isEmpty == false {
...// title was filled
}
Or better (thank you Leo Dabus):
if let title = txtTitle.text, !title.isEmpty {
...// title was filled
}
回答3:
TEXTFIELD VALIDATION ======================>
func textFieldShouldReturn(_ textField: UITextField) -> Bool
{
switch (textField.tag)
{
case 1:
password.becomeFirstResponder()
case 2 :
confirm_pass.becomeFirstResponder()
case 3 :
email.becomeFirstResponder()
case 4 :
phone.becomeFirstResponder()
case 5 :
phone.resignFirstResponder()
default: break
}
return true
}
func textFieldShouldClear(_ textField: UITextField) -> Bool
{
return true
}
func textFieldDidEndEditing(_ textField: UITextField)
{
if (textField == username)
{
let name_reg = "[A-Za-z0-9]{5,20}"
let name_test = NSPredicate(format: "SELF MATCHES %@", name_reg)
if name_test.evaluate(with: username.text) == false
{
let alert = UIAlertController(title: "Information", message: "Enter the name in correct format", preferredStyle: .alert)
let ok = UIAlertAction(title: "Ok", style: .default, handler: nil)
let cancel = UIAlertAction(title: "Cancel", style: .default, handler: nil)
alert.addAction(ok)
alert.addAction(cancel)
self.present(alert, animated: true, completion: nil)
}
}
if (textField == password)
{
let name_reg = "[A-Z0-9a-z._%@+-]{6,10}"
let name_test = NSPredicate(format: "SELF MATCHES %@", name_reg)
if name_test.evaluate(with: password.text) == false
{
let alert = UIAlertController(title: "Information", message: "Enter the password in correct format", preferredStyle: .alert)
let ok = UIAlertAction(title: "Ok", style: .default, handler: nil)
let cancel = UIAlertAction(title: "Cancel", style: .default, handler: nil)
alert.addAction(ok)
alert.addAction(cancel)
self.present(alert, animated: true, completion: nil)
}
}
if (textField == email)
{
let name_reg = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}"
let name_test = NSPredicate(format: "SELF MATCHES %@", name_reg)
if name_test.evaluate(with: email.text) == false
{
let alert = UIAlertController(title: "Information", message: "Enter the E-mail in correct format", preferredStyle: .alert)
let ok = UIAlertAction(title: "Ok", style: .default, handler: nil)
let cancel = UIAlertAction(title: "Cancel", style: .default, handler: nil)
alert.addAction(ok)
alert.addAction(cancel)
self.present(alert, animated: true, completion: nil)
}
}
if (textField == phone)
{
let name_reg = "[0-9]{10}"
let name_test = NSPredicate(format: "SELF MATCHES %@", name_reg)
if name_test.evaluate(with: phone.text) == false
{
let alert = UIAlertController(title: "Information", message: "Enter your number in correct format", preferredStyle: .alert)
let ok = UIAlertAction(title: "Ok", style: .default, handler: nil)
let cancel = UIAlertAction(title: "Cancel", style: .default, handler: nil)
alert.addAction(ok)
alert.addAction(cancel)
self.present(alert, animated: true, completion: nil)
}
}
}
来源:https://stackoverflow.com/questions/41023145/validate-text-fields-swift-3