如何使用字符串参数创建选择器
How to create Selector with parameters from string
我正在使用 Swift 3.1 和 Xcode 8.3.3 编写程序。我想创建一个 class,负责在键盘出现和消失时移动整个视图。但是我在使用字符串参数创建自定义选择器时遇到了困难。要显示或隐藏键盘,我们需要函数:
func keyboardWillShow(notification: Notification) {
//Code moving view when keyboard appears
}
我正在尝试创建这样的选择器:
let selector = Selector(("keyboardWillShow")
NotificationCenter.default.addObserver(view, selector: selector, name: .UIKeyboardWillShow, object: anyView.view.window)
正在编译,但是当键盘出现时,它崩溃了。
因为它是独立的 class 我不能使用这个结构:
#selector(keyboardWillShow)
因为它将Swift函数转换为Objective-C函数(添加@objc)。
所以问题是:如何创建带有参数字符串的选择器表单?
P. S. 我可以把整个代码放在那里,但我不希望问题太大,所以如果有人问我会编辑问题...
这种方式可行,
override func viewDidLoad() {
super.viewDidLoad()
// put it wherever you want
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(showKeyboard), name:UIKeyboardWillShowNotification, object: nil)
}
func showKeyboard(sender: NSNotification) {
keyboardWillShow(sender, adjustHeight: 150)
}
func keyboardWillShow(sender: NSNotification, adjustHeight: CGFloat) {
if let keyboardSize = (sender.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.CGRectValue() {
keyboardHeight = keyboardSize.height
// do your calculations
}
}
这将帮助您实现预期的结果。
Here is what you want, Selector with string type and Notification parameter argument
Swift 4
NotificationCenter.default.addObserver(self, selector: Selector(("showKeyboard:")), name:NSNotification.Name.UIKeyboardWillShow, object: nil)
var keyboardHeight = 0.0
//-------------------
@objc func showKeyboard(_ sender: Notification) {
keyboardWillShow(sender: sender as NSNotification, adjustHeight: 150)
print("sender - \(sender)")
}
//-------------------
func keyboardWillShow(sender: NSNotification, adjustHeight: CGFloat) {
if let keyboardSize = (sender.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
keyboardHeight = Double(keyboardSize.height)
// do your calculations
}
}
Swift 3
NotificationCenter.default.addObserver(view, selector: Selector(("keyboardWillShow:")), name: .UIKeyboardWillShow, object: anyView.view.window)
func keyboardWillShow(_ notification: Notification) {
keyboardWillShow(sender: sender as NSNotification, adjustHeight: 150)
print("sender - \(sender)")
}
这里是普通的选择器,根据语言支持
Swift 4
NotificationCenter.default.addObserver(self, selector: #selector(self.showKeyboard(sender:)), name:NSNotification.Name.UIKeyboardWillShow, object: nil)
var keyboardHeight = 0.0
//-------------------
@objc func showKeyboard(sender: NSNotification) {
keyboardWillShow(sender: sender, adjustHeight: 150)
}
//-------------------
func keyboardWillShow(sender: NSNotification, adjustHeight: CGFloat) {
if let keyboardSize = (sender.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
keyboardHeight = Double(keyboardSize.height)
// your operations here
}
}
Swift 3
NotificationCenter.default.addObserver(self, selector: #selector(self.showKeyboard(sender:)), name:NSNotification.Name.UIKeyboardWillShow, object: nil)
var keyboardHeight = 0.0
//-------------------
func showKeyboard(sender: NSNotification) {
keyboardWillShow(sender: sender, adjustHeight: 150)
}
//-------------------
func keyboardWillShow(sender: NSNotification, adjustHeight: CGFloat) {
if let keyboardSize = (sender.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
keyboardHeight = Double(keyboardSize.height)
// your operations here
}
}
我正在使用 Swift 3.1 和 Xcode 8.3.3 编写程序。我想创建一个 class,负责在键盘出现和消失时移动整个视图。但是我在使用字符串参数创建自定义选择器时遇到了困难。要显示或隐藏键盘,我们需要函数:
func keyboardWillShow(notification: Notification) {
//Code moving view when keyboard appears
}
我正在尝试创建这样的选择器:
let selector = Selector(("keyboardWillShow")
NotificationCenter.default.addObserver(view, selector: selector, name: .UIKeyboardWillShow, object: anyView.view.window)
正在编译,但是当键盘出现时,它崩溃了。 因为它是独立的 class 我不能使用这个结构:
#selector(keyboardWillShow)
因为它将Swift函数转换为Objective-C函数(添加@objc)。 所以问题是:如何创建带有参数字符串的选择器表单?
P. S. 我可以把整个代码放在那里,但我不希望问题太大,所以如果有人问我会编辑问题...
这种方式可行,
override func viewDidLoad() {
super.viewDidLoad()
// put it wherever you want
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(showKeyboard), name:UIKeyboardWillShowNotification, object: nil)
}
func showKeyboard(sender: NSNotification) {
keyboardWillShow(sender, adjustHeight: 150)
}
func keyboardWillShow(sender: NSNotification, adjustHeight: CGFloat) {
if let keyboardSize = (sender.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.CGRectValue() {
keyboardHeight = keyboardSize.height
// do your calculations
}
}
这将帮助您实现预期的结果。
Here is what you want, Selector with string type and Notification parameter argument
Swift 4
NotificationCenter.default.addObserver(self, selector: Selector(("showKeyboard:")), name:NSNotification.Name.UIKeyboardWillShow, object: nil)
var keyboardHeight = 0.0
//-------------------
@objc func showKeyboard(_ sender: Notification) {
keyboardWillShow(sender: sender as NSNotification, adjustHeight: 150)
print("sender - \(sender)")
}
//-------------------
func keyboardWillShow(sender: NSNotification, adjustHeight: CGFloat) {
if let keyboardSize = (sender.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
keyboardHeight = Double(keyboardSize.height)
// do your calculations
}
}
Swift 3
NotificationCenter.default.addObserver(view, selector: Selector(("keyboardWillShow:")), name: .UIKeyboardWillShow, object: anyView.view.window)
func keyboardWillShow(_ notification: Notification) {
keyboardWillShow(sender: sender as NSNotification, adjustHeight: 150)
print("sender - \(sender)")
}
这里是普通的选择器,根据语言支持
Swift 4
NotificationCenter.default.addObserver(self, selector: #selector(self.showKeyboard(sender:)), name:NSNotification.Name.UIKeyboardWillShow, object: nil)
var keyboardHeight = 0.0
//-------------------
@objc func showKeyboard(sender: NSNotification) {
keyboardWillShow(sender: sender, adjustHeight: 150)
}
//-------------------
func keyboardWillShow(sender: NSNotification, adjustHeight: CGFloat) {
if let keyboardSize = (sender.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
keyboardHeight = Double(keyboardSize.height)
// your operations here
}
}
Swift 3
NotificationCenter.default.addObserver(self, selector: #selector(self.showKeyboard(sender:)), name:NSNotification.Name.UIKeyboardWillShow, object: nil)
var keyboardHeight = 0.0
//-------------------
func showKeyboard(sender: NSNotification) {
keyboardWillShow(sender: sender, adjustHeight: 150)
}
//-------------------
func keyboardWillShow(sender: NSNotification, adjustHeight: CGFloat) {
if let keyboardSize = (sender.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
keyboardHeight = Double(keyboardSize.height)
// your operations here
}
}