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

时间:2018-09-23 12:34:20

标签: nsnotifications xcode10 swift4.2

下面的代码在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.

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

3 个答案:

答案 0 :(得分:16)

正确的格式是:

UIResponder.keyboardWillShowNotification

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

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

这是Xcode 10的一个已知问题。自动更正在更正通知名称时,对于Swift 4.2不能正常工作。

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

答案 1 :(得分:0)

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

什么都行不通,直到我在文件顶部添加以下内容:

#import UIKit

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

答案 2 :(得分:0)

所选的answer不完整,会产生编译器错误,

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

这是工作格式,

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