Objective-C 观察者 - 如何在 Swift 中使用

Posted

技术标签:

【中文标题】Objective-C 观察者 - 如何在 Swift 中使用【英文标题】:Objective-C observer - how to use in Swift 【发布时间】:2017-02-03 08:25:09 【问题描述】:

我正在向 Objective-C 应用程序添加使用 Swift 的新功能。

我在 Objective-C (registration.m) 中有这个观察者:

[[NSNotificationCenter defaultCenter] removeObserver:self name:NOTIFICATION_SERVER_SENT_CONFIRMATION_SMS object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(confirmSms) name:NOTIFICATION_SERVER_SENT_CONFIRMATION_SMS object:nil];

在confirm.m中:

[[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_SERVER_SENT_CONFIRMATION_SMS object:nil];

如何在 Swift 中观察到这一点?我试过了

NotificationCenter.default.removeObserver(self,
                                                  name: NOTIFICATION_SERVER_SENT_CONFIRMATION_SMS,
                                                  object:nil);

NotificationCenter.default.addObserver(self,
                                              selector:#selector(self.confirmationSmsSent),
                                              name: NOTIFICATION_SERVER_SENT_CONFIRMATION_SMS,
                                              object: nil);

我得到了

使用未解析的标识符 'NOTIFICATION_SERVER_SENT_CONFIRMATION_SMS'

谢谢

// 编辑:

我已经在 Obj-C 中声明了:

NSString *const NOTIFICATION_SERVER_SENT_CONFIRMATION_SMS = @"confirmationSMSSent";

这还能用吗?

let name: NSNotification.Name = NSNotification.Name("Your_Notification_Name_Key_String") //NOTIFICATION_SERVER_SENT_CONFIRMATION_SMS

当我使用

NotificationCenter.default.addObserver(self, selector:#selector(self.confirmationSmsSent(_:)), name: name, object: nil)

func confirmationSmsSent(notification: NSNotification) 


我有错误

“MyController”类型的值没有成员“confirmationSmsSent”

NotificationCenter.default.addObserver(self, selector:#selector(self.confirmationSmsSent(_:)), name: name, object: nil)

【问题讨论】:

***.com/questions/36910965/… 在女巫文件中你声明了 NOTIFICATION_SERVER_SENT_CONFIRMATION_SMS 变量? 【参考方案1】:

在 Swift 3 中,语法发生了变化。你必须定义NSNotification.Name的变量

let name: NSNotification.Name = NSNotification.Name("Your_Notification_Name_Key_String") //NOTIFICATION_SERVER_SENT_CONFIRMATION_SMS

//Add Notification
NotificationCenter.default.addObserver(self, selector:#selector(self.yourSelector(_:)), name: name, object: nil)

//Remove Notification Observer
NotificationCenter.default.removeObserver(self, name: name, object: nil)

//Your Selector
func yourSelector(_ notification: Notification) 
//Code

【讨论】:

和 self.yourSelector(_:) 应该定义为 func yourSelector()? () 中的参数应该是什么?在 func ConfirmationSmsSent(notification: NSNotification) 我遇到选择器错误 “MyController”类型的值没有成员“confirmationSmsSent” @sohil-r-memon 谢谢!【参考方案2】:

这是因为您尚未声明 NOTIFICATION_SERVER_SENT_CONFIRMATION_SMS。

通常通知名称只是一个字符串,顺便说一句,您必须将其转换为嵌套的 NSNotification.Name 类型。

let NOTIFICATION_SERVER_SENT_CONFIRMATION_SMS = NSNotification.Name("<some string>")

【讨论】:

【参考方案3】:

最有用的swift-lije代码是扩展

extension Notification.Name 
static let someNewName = "ThatsItImAwsome" 
 

帖子内使用:

.someNewKey

这个:

NotificationCenter.default.addObserver(self, selector:#selector(self.yourSelector(_:)), name: .someNewKey, object: nil)

【讨论】:

以上是关于Objective-C 观察者 - 如何在 Swift 中使用的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C 删除某个通知的所有观察者

Objective-C 观察者模式--KVO和NSNotificationCenter的使用

用于管理观察者的 Objective-C 设计模式

如何在 SWI-Prolog 上设置闹钟?

arm体系如何对SWI功能

Swift和Objective-C混合编程——Swift调用OC