将代码转换为 Swift 4.2 时通知名称出错

Error with notification names while converting code to Swift 4.2

下面的代码在 Swift 4.2:

之前工作正常
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChange(notification:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)

当我点击'Fix'选项时,它变成:

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.

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

正确的形式是:

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.

的实例变量

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

直到我在我的文件顶部添加这个:

import UIKit

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

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

Cannot invoke 'addObserver' with an argument list of type '(RegistrationViewController, selector: Selector, name: NSNotification.Name)'

这是工作格式,

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