Ty Yiu
Ty Yiu

Reputation: 85

Set UITextField to mm-dd-yy format in swift

So I want to have a UITextField to only accept digits, solved that by using a custom keyboard input.

The intention of this UITextField is to get someones birthday. I don't want to use an UIDatePicker tough as I don't like it's appearance.

I'd like that the TextField automatically inserts dashes after every second digit that the user put into the TextField.

dd-mm-yy is the placeholder text. I either thought of making the dashes permanently but I don't know how to do that either.

How can I do this?

Upvotes: 3

Views: 4889

Answers (2)

Sukh
Sukh

Reputation: 1398

Swift5 // Use textfield delegate shouldChangeCharactersIn

 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
      if (textField.text?.count == 2) || (textField.text?.count == 5) {
           if !(string == "") {
                textField.text = (textField.text)! + "-"
               }
            }
       return !(textField.text!.count > 7 && (string.count ) > range.length)
    }

Upvotes: 0

Gokul G
Gokul G

Reputation: 2096

You want to allow user to enter text in textfield in this dd-mm-yy right ? if it so i'am sure this will help you.

  1. In top of your class declare this variable which we gonna use later.

    var dateFormate = Bool()
    
  2. Add delegate and tag for that textfield.

  3. Then add this following delegate method

    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    
    //1. To make sure that this is applicable to only particular textfield add tag.
    if textField.tag == 1 {
        //2. this one helps to make sure that user enters only numeric characters and '-' in fields
        let numbersOnly = NSCharacterSet(charactersInString: "1234567890-")
        let characterSetFromTextField = NSCharacterSet(charactersInString: string)
    
        let Validate:Bool = numbersOnly .isSupersetOfSet(characterSetFromTextField)
        if !Validate {
            return false;
        }
        if range.length + range.location > textField.text?.characters.count {
            return false
        }
        let newLength = (textField.text?.characters.count)! + string.characters.count - range.length
        if newLength == 3 || newLength == 6 {
            let  char = string.cStringUsingEncoding(NSUTF8StringEncoding)!
            let isBackSpace = strcmp(char, "\\b")
    
            if (isBackSpace == -92) {
                dateFormate = false;
            }else{
                dateFormate = true;
            }
    
            if dateFormate {
                let textContent:String!
                textContent = textField.text
                //3.Here we add '-' on overself.
                let textWithHifen:NSString = "\(textContent)-"
                textField.text = textWithHifen as String
                dateFormate = false
            }
        }
        //4. this one helps to make sure only 8 character is added in textfield .(ie: dd-mm-yy)
        return newLength <= 8;
    
    }
    return true
    }
    
  4. That's it now user can enter their DOB.No need to worry about '-' it will be added automatically.

Swift 3:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

    //1. To make sure that this is applicable to only particular textfield add tag.
    if textField.tag == 1 {
        //2. this one helps to make sure that user enters only numeric characters and '-' in fields
        let numbersOnly = CharacterSet(charactersIn: "1234567890-")

        let Validate = string.rangeOfCharacter(from: numbersOnly.inverted) == nil ? true : false
        if !Validate {
            return false;
        }
        if range.length + range.location > textField.text?.characters.count {
            return false
        }
        let newLength = (textField.text?.characters.count)! + string.characters.count - range.length
        if newLength == 3 || newLength == 6 {
            let  char = string.cString(using: NSUTF8StringEncoding)!
            let isBackSpace = strcmp(char, "\\b")

            if (isBackSpace == -92) {
                dateFormate = false;
            }else{
                dateFormate = true;
            }

            if dateFormate {
                let textContent:String!
                textContent = textField.text
                //3.Here we add '-' on overself.
                let textWithHifen:NSString = "\(textContent)-"
                textField.text = textWithHifen as String
                dateFormate = false
            }
        }
        //4. this one helps to make sure only 8 character is added in textfield .(ie: dd-mm-yy)
        return newLength <= 8;

    }
    return true
}

Upvotes: 3

Related Questions