我使用了 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/