I am trying to create a view in my application that displays an error UILabelwhen the text inside UITextFielddoes not match a particular regular expression. Everything works fine, except when my UITextFieldcontains an invalid entry, and then I touch the screen to close the keyboard. After the keyboard deviates, it UITextFieldmoves over mine UITextView(red text), and I canβt understand why. I have set breakpoints in my code, but it seems that none of my codes are executed after the keyboard is rejected. Any help is appreciated.

import UIKit
class ViewController: UIViewController {
@IBOutlet var titleLabel:UILabel!
@IBOutlet var errorLabel:UITextView!
@IBOutlet var textBox:UITextField!
@IBOutlet var createButton:UIButton!
var deltaHeight:CGFloat!
var beenMoved = true
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: "validateText", name: UITextFieldTextDidChangeNotification, object: textBox)
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "dismissKeyboard"))
titleLabel.text = "Container Number:"
errorLabel.text = "Error, Invalid container number.\nRe-enter number."
deltaHeight = errorLabel.frame.size.height + 8.0
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func dismissKeyboard() {
textBox.resignFirstResponder()
}
func validateText() {
dispatch_async(dispatch_get_main_queue(), {
let predicate = NSPredicate(format: "SELF MATCHES %@", "[a-zA-Z0-9#]+")
let empty = self.textBox.text!.isEmpty
let valid = predicate.evaluateWithObject(self.textBox.text)
if valid || empty {
if(!self.beenMoved) {
self.errorLabel.hidden = true
UIView.animateWithDuration(0.4, animations: {
self.textBox.frame.origin.y -= self.deltaHeight
self.createButton.frame.origin.y -= self.deltaHeight
})
self.beenMoved = true
}
}
else {
if(self.beenMoved) {
UIView.animateWithDuration(0.4, animations: {
self.textBox.frame.origin.y += self.deltaHeight
self.createButton.frame.origin.y += self.deltaHeight
}, completion: {
(flag:Bool) in
self.errorLabel.hidden = false
})
self.beenMoved = false
}
}
if empty {
self.createButton.enabled = false
}
else {
self.createButton.enabled = true
}
})
}
}
source
share