9

下面的代码在 Swift 4.2 之前运行良好:

NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChange(notification:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)

当我单击“修复”选项时,它变为:

NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChange(notification:)), name: NSNotification.Name.UIResponder.keyboardWillShowNotification, object: nil)

但它仍然被标记为错误。这是解释:

Type 'NSNotification.Name' has no member 'UIResponder'

然后我尝试删除'UIResponder':

NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChange(notification:)), name: NSNotification.Name.

...但我不知道我应该如何完成它。

4

3 回答 3

33

正确的形式是:

UIResponder.keyboardWillShowNotification

...因此,您的代码变为:

NotificationCenter.default.addObserver(
    self, 
    selector: #selector(keyboardWillChange(notification:)), 
    name: UIResponder.keyboardWillShowNotification, 
    object: nil
)

这是 Xcode 10 的一个已知问题。自动修复 - 在更正通知名称时,它在 Swift 4.2 中无法正常工作。

在 Swift 4.2 中,许多Notification.Name实例成为其他类中的实例变量。例如,keyboardWillShowNotification现在是 的实例变量UIResponder

于 2018-09-23T12:51:10.520 回答
1

对于那里的其他人,我正在构建(我认为是)一个独立于 UI 的类并且没有导入 UIKit。

在我在文件顶部添加之前,没有任何效果,这个:

import UIKit

似乎某些通知(UIApplication、UIResponder 等中的通知)可能已被重构为 UIKIt。

于 2019-03-19T05:13:38.990 回答
0

选择的答案不完整并产生编译器错误,

无法使用类型为“(RegistrationViewController,选择器:选择器,名称:NSNotification.Name)”的参数列表调用“addObserver”

这是工作格式,

NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChange(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil)
于 2020-03-28T16:50:03.423 回答