How can I declare that a text field can only contain an integer?
- Make your view controller a
UITextFieldDelegate
by addingUITextFieldDelegate
to the class declaration. - Add
IBOutlet
s for your text field and your button. - In
viewDidLoad
set your button'sisEnabled
property tofalse
and setself
as thetextField.delegate
. - Implement
textField:shouldChangeCharactersInRange:replacementString:
method. This method will be called every time your text field is edited. In there, check if the current text field converts to anInt
by callingInt(text)
and enable/disable your button as desired.
Here is the code:
class ViewController : UIViewController, UITextFieldDelegate {
@IBOutlet weak var textField: UITextField!
@IBOutlet weak var button: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
button.isEnabled = false
textField.delegate = self
textField.keyboardType = .numberPad
}
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
// Find out what the text field will be after adding the current edit
let text = (textField.text as NSString).stringByReplacingCharactersInRange(range, withString: string)
if Int(text) != nil {
// Text field converted to an Int
button.isEnabled = true
} else {
// Text field is not an Int
button.isEnabled = false
}
// Return true so the text field will be changed
return true
}
}
Two things:
Specify the keyboard type to only show the numeric keypad. So, set the
keyboardType
to.numberPad
. This, however is not enough to stop the user from entering invalid characters in the text field. For example, the user is still able to paste text or switch keyboards when using an iPad.Specify the text field's delegate and implement
shouldChangeCharactersInRange
that will not accept any characters other than the digits0
though9
:class ViewController: UIViewController, UITextFieldDelegate { @IBOutlet weak var textField: UITextField! override func viewDidLoad() { super.viewDidLoad() // you can set the following two properties for the text field in Interface Builder, if you'd prefer textField.delegate = self textField.keyboardType = .numberPad } func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { let invalidCharacters = CharacterSet(charactersIn: "0123456789").inverted return string.rangeOfCharacter(from: invalidCharacters) == nil } // or, alternatively: // // func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { // return string.range(of: "^\\d*$", options: .regularExpression) != nil // } }
For Swift 2 rendition, see previous revision of this answer.