1

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"

    }
}
2
  • Try this e.g. txtTitle.text?.characters.count > 0. Please refactor your code .. be aware of forced unwrapped optionals! Commented Dec 7, 2016 at 17:07
  • 1
    @ThomasG., if you use SwiftLint, it will discourage comparing a count to 0, and recommend isEmpty. ;) Commented Dec 7, 2016 at 17:16

3 Answers 3

5

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.

Sign up to request clarification or add additional context in comments.

Comments

1

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
}

1 Comment

if let title = txtTitle.text, !title.isEmpty {
1

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)
        }
    }

}

1 Comment

Welcome to Stackoverflow. While this answer may be correct, leaving some explanation would improve this question in a long run.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.