Xcode6 swift NSObject AnyObject error

I used the code from How to move the contents of a UIViewController up when the keyboard appears using Swift , trying to prevent the keyboard from closing my view.

Somehow I can't get it to work (mainly because of my n00b programming skills) This is the error I received: [NSObject: AnyObject] does not have a member named 'valueForKey'in this line of code:let s:NSValue = sender.userInfo.valueForKey(UIKeyboardFrameBeginUserInfoKey) as NSValue;

I assume that I will need to create an IBAction, but am not trying anything to work. What do I need to do to make the code work? And why should I do this? What does NSObject do?

here is the code:

override func viewDidLoad() {
    super.viewDidLoad()
    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name:UIKeyboardWillShowNotification, object: nil);
    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name:UIKeyboardWillHideNotification, object: nil);
}

deinit {
    NSNotificationCenter.defaultCenter().removeObserver(self);
}

func keyboardWillShow(sender: NSNotification) {
    let s:NSValue = sender.userInfo.valueForKey(UIKeyboardFrameEndUserInfoKey) as NSValue;
    let rect :CGRect = s.CGRectValue();
    var frame = self.textField.frame;
    frame.origin.y = frame.origin.y - rect.height;
    self.textField.frame = frame;
}

func keyboardWillHide(sender: NSNotification) {
    let s:NSValue = sender.userInfo.valueForKey(UIKeyboardFrameBeginUserInfoKey) as NSValue;
    let rect :CGRect = s.CGRectValue();
    var frame = self.textField.frame;
    frame.origin.y = frame.origin.y + rect.height;
    self.textField.frame = frame;
}
+4
source share
1 answer

userInfo NSDictionary fucntions

func keyboardWillShow(sender: NSNotification) {
    let dict:NSDictionary = sender.userInfo as NSDictionary
    let s:NSValue = dict.valueForKey(UIKeyboardFrameEndUserInfoKey) as NSValue;
    let rect :CGRect = s.CGRectValue();
    var frame = self.textField.frame;
    frame.origin.y = frame.origin.y - rect.height;
    self.textField.frame = frame;
}

func keyboardWillHide(sender: NSNotification) {
    let dict:NSDictionary = sender.userInfo as NSDictionary
    let s:NSValue = dict.valueForKey(UIKeyboardFrameBeginUserInfoKey) as NSValue;
    let rect :CGRect = s.CGRectValue();
    var frame = self.textField.frame;
    frame.origin.y = frame.origin.y + rect.height;
    self.textField.frame = frame;
}

Edit

//Add this above viewDidLoad
    var selecteTextFieldOriginalY:CGFloat = 0.0;

//write in viewDidLoad
    override func viewDidLoad() {
        super.viewDidLoad()
        NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name:UIKeyboardDidShowNotification, object: nil);
        NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name:UIKeyboardDidHideNotification, object: nil);
    }

//Replace these functions
    func keyboardWillShow(sender: NSNotification) {
        let dict:NSDictionary = sender.userInfo as NSDictionary
        let s:NSValue = dict.valueForKey(UIKeyboardFrameEndUserInfoKey) as NSValue;
        let rect :CGRect = s.CGRectValue();

        var frame = self.textField.frame;
        selecteTextFieldOriginalY = frame.origin.y;

//Adjust 80 according to your need actually if is for padding and quickTypeView
        var offset = (rect.height - ((self.view.frame.height - self.textField.frame.origin.y)+self.textField.frame.size.height))+80;
        print(offset)
        frame.origin.y = offset>0 ? frame.origin.y - offset : frame.origin.y ;
        UIView.animateWithDuration(0.3, animations:{
            self.textField.frame = frame;

            }
        )
    }

    func keyboardWillHide(sender: NSNotification) {
        let dict:NSDictionary = sender.userInfo as NSDictionary
        let s:NSValue = dict.valueForKey(UIKeyboardFrameBeginUserInfoKey) as NSValue;
        let rect :CGRect = s.CGRectValue();
        var frame = self.textField.frame;
        frame.origin.y = selecteTextFieldOriginalY ;

        UIView.animateWithDuration(0.3, animations:{
            self.textField.frame = frame;

            })
    }
+3

All Articles