NotificationCenter.default.addObserver 没有调用 objective C 函数

NotificationCenter.default.addObserver is not calling the objective C function

我在 Xcode 11.0 上使用 swift 5,试图将 userInfo 从 view-controller-A 传递到 view-controller-B,我已经做了一个通知中心 post 在 view-controller-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- 将 name: NSNotification.Name("didReceiveSession") 更改为 name: NSNotification.Name(rawValue: "didReceiveSession") 在两个视图控制器中

2- 在 vi​​ew-controller-A 中创建一个实例:

2.1- share = view-controller-A()

2.2- 将 object: nil 更改为 object: view-controller-A.share -B)

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

但不幸的是,所有的尝试都没有奏效。我不知道哪里出了问题。

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

你想要做的是将你的 "sessionID" 值传递给 from VC-A to VC-BVC-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
    }
}

你的问题出在先后顺序上。

postaddObserver 之前调用时,OS 没有地方可以传递通知,因此通知被丢弃。

您需要确保您有一个活跃的观察者,即在您执行 `post.

之前调用 addObserver