NotificationCenter.default.addObserver没有调用目标C函数



我在Xcode 11.0上使用swift 5,试图将userInfo从view-controller-a传递到view-controler-B,我已经在view-controlle-a中发布了通知中心帖子,下面是代码:

let uid = response["session-id"] as? String
NotificationCenter.default.post(
name: NSNotification.Name("didReceiveSession"),
object: nil,
userInfo: ["uid" : uid!]
)

view-controller-B中,我注册了通知并添加了一个观察者,如下所示:

NotificationCenter.default.addObserver(
self,
selector: #selector(self.getSessionId),
name: NSNotification.Name("didReceiveSession"),
object: nil
)

这里是getSessionId

@objc func getSessionId(_ notification: Notification)
{
if let data = notification.userInfo as? [String: String]
{
self.session_Id = data["uid"]
}
}

我尝试了很多变通方法,比如:

1-更改名称:NSNotification。名称("didReceiveSession"(名称:NSNotification。两个视图控制器中的名称(rawValue:"didReceiveSession"(

2-在view-controller-A:中创建一个实例

2.1-share=view-controller-A((

2.2-在addObserver(view-controller-B(中将object:nil更改为object:view-controler-A共享

3-将view-controller-B中的选择器从选择器:#selector(self.getSessionId(更改为选择符:#选择器(getSessionId(_:((

但不幸的是,所有的尝试都没有奏效。我搞不清楚出了什么问题。

这是一种非常不正确的使用通知的方式。

VC-A移动到/呈现VC-B时,您要做的是将"sessionID"值从VC-A传递到VC-B

假设您使用的是segue。。。

根据您发布的内容,您在VC-B中已经有了一个变量/属性,可能是:

var session_ID: [String] = ""

因此,在VC-A中,您可以执行以下操作:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let nextVC = segue.destination as? VCB {
nextVC.session_ID = self.uid
}
}

您的问题在于事件的顺序。

当在addObserver之前调用post时,操作系统没有地方向其传递通知,因此通知被丢弃。

你需要确保你有一个活跃的观察者,也就是说,在你发表你的文章之前,addObserver被调用了。

最新更新