没有使用 Objective-C 选择器声明用于通知 UIKeyboardWillShowNotification 和 UIKeyboardWillHideNotification 的方法

Posted

技术标签:

【中文标题】没有使用 Objective-C 选择器声明用于通知 UIKeyboardWillShowNotification 和 UIKeyboardWillHideNotification 的方法【英文标题】:No Method declared with Objective-C Selector for Notification UIKeyboardWillShowNotification and UIKeyboardWillHideNotification 【发布时间】:2016-07-21 20:06:39 【问题描述】:

在最近更新 Xcode 之后,以前可以工作的这段代码不再工作了。大多数 Selector(":") 都有自动更正,但此代码除外:

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

标记错误:

没有使用 Objective C 选择器 'keyboardWillSHow:' 声明的方法

这张图片显示了不同的尝试,但都失败了。

这段代码的新语法是什么?

【问题讨论】:

【参考方案1】:

如下分配Selector

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(YourClassName.keyboardWillShow(_:)), name:UIKeyboardWillShowNotification, object: nil);

以及更新你想要的方法:

func keyboardWillShow(notification: NSNotification) 

     //Update UI or Do Something


你可以为UIKeyboardWillHideNotification做同样的事情。

【讨论】:

【参考方案2】:

Swift 3 示例:

NotificationCenter.default.addObserver(self, selector: #selector(YourClass.keyboardWillShow(notification:)), name:NSNotification.Name.UIKeyboardWillShow, object: nil);
NotificationCenter.default.addObserver(self, selector: #selector(YourClass.keyboardWillHide(notification:)), name:NSNotification.Name.UIKeyboardWillHide, object: nil);

// MARK: - Actions

@objc private func keyboardWillShow(notification: Notification) 
    print("keyboardWillShow called")


@objc private func keyboardWillHide(notification: Notification) 
    print("keyboardWillHide called")

【讨论】:

【参考方案3】:

swift 语法发生了变化。试试这个:

NSNotificationCenter.defaultCenter().addObserver(self, selector: #Selector(ClassThatHasTheSelector.keyboardWillShow), name:UIKeyboardWillShowNotification, object: nil);

【讨论】:

它仍然标记错误:类型:'SignInViewController' 没有成员'KeyboardWillShow'。除非你没有更新你的 Xcode,否则这段代码可以工作。 找不到那个方法。确保keyboardWillShow 在该类中可用并且名称匹配(我注意到错误消息大写键盘)。以大写字母开头的方法名称是非正统的。 keyBoardWillShow 没有大写:抱歉错字。仍然标记与上述相同的错误。 试试 self.keyboardWillShow 而不是类名。 我已经试过了。没用。我认为这是 Xcode 的新问题。【参考方案4】:

我遇到了同样的问题,还发现你引用的类也必须是 NSObject 的子类(这不是必需的。Swift 中的情况)否则你会收到消息

error: argument of '#selector' refers to instance method 'yourMethod(notification:)' that is not exposed to Objective-C"

【讨论】:

【参考方案5】:

Swift 3 语法(就像上面的 Sohil 一样):

    func someMethod(sender: Any?) 
      ...
    

    func someBlockCallingWithSelector() 
      someObject.addTarget(self, action: #selector(someMethod), for: .valueChanged) 
    

【讨论】:

以上是关于没有使用 Objective-C 选择器声明用于通知 UIKeyboardWillShowNotification 和 UIKeyboardWillHideNotification 的方法的主要内容,如果未能解决你的问题,请参考以下文章

Objective-c 中的 swift 3 方法失败,没有可见的 @interface for 'MySwiftClass' 声明选择器 'addX:andY'

编译器错误:使用 Objective-C 选择器的方法与先前使用相同 Objective-C 选择器的声明冲突

Object-C 中的 Swift 代码:“ClassName”没有可见的@interface 声明选择器“alloc”

什么时候定义objective-c方法?

知识梳理Objective-C中的@property

在 Objective-c 上使用静态 Swift 方法时,“选择器没有已知的类方法”