xcode6 swift NSObject AnyObject 错误

标签 xcode swift ios8 xcode6

我使用了 How to move content of UIViewController upwards as Keypad appears using Swift 中的代码试图阻止键盘遮挡我的视线。

不知何故我无法让它工作(主要是因为我的 n00b 编程“技能”) 这是我得到的错误:[NSObject: AnyObject] 在这行代码中没有名为“valueForKey”的成员:let s:NSValue = sender.userInfo.valueForKey(UIKeyboardFrameBeginUserInfoKey)作为 NSValue;

我想我必须创建某种 IBAction,但我尝试的任何方法都不起作用。我需要做什么才能使代码正常工作?为什么我必须这样做? NSObject 是做什么的?

代码如下:

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

最佳答案

你必须将 userInfo 转换为 NSDictionary 用下面的函数替换上面的函数

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

编辑

//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;

            })
    }

关于xcode6 swift NSObject AnyObject 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24844631/

相关文章:

ios - 应用程序运行时可以刷新 NSTemporaryDirectory 吗?

ios - AVSpeechSynthesizer 在后台运行后停止工作

iphone - 应用程序加载器卡在 "testing tcp udp connectivity"

ios - SwiftUI 以编程方式选择列表项

swift - Realm Swift 结果在索引处获取对象

swift - 类层次结构中的便利初始化导致无限递归

ios - 将 UITextView 中的文本添加到数组中?

iphone - 我如何从字典字典中获取数组中的值

ios - 将唯一对象添加到数组

ios - Storyboard中带有自定义字体的属性字符串无法正确加载