【问题标题】:NotificationCenter.default.addObserver is not calling the objective C functionNotificationCenter.default.addObserver 没有调用目标 C 函数
【发布时间】:2020-08-11 03:25:03
【问题描述】:

我在 Xcode 11.0 上使用 swift 5,尝试将 userInfo 从 view-controller-A 传递到 view-controller-B,并且我已经在 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- 在addObserver (view-controller-B)中将object: nil 改为object: view-controller-A.share

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

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

【问题讨论】:

  • 你怎么知道它没有被调用?在处理函数中的if let ... 上设置断点。这会触发吗?此外,在 postaddObserver 调用上设置断点。 addObserver是在post之前触发的吗?
  • @Gereon 我确实在处理函数上设置了一个断点,这就是我知道它没有被调用的方式。我还在帖子和 addObserver 上设置了一个断点,帖子在 addObserver 之前被触发,所以没有任何可疑之处。
  • 相反。如果postaddObserver之前触发,谁会观察通知?
  • 那么 addObserver 应该在 post 之前触发?
  • 当然。如果没有,则操作系统没有地方可以将通知传递到,它会立即被丢弃。

标签: ios notificationcenter


【解决方案1】:

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

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

你需要确保你有一个活跃的观察者,即在你发布你的`post之前调用addObserver

【讨论】:

  • 是的,看来我应该使用 segue 而不是通知中心传递值,因为在我的情况下使用它不合逻辑。
【解决方案2】:

这是使用通知的一种非常错误的方式。

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
    }
}

【讨论】:

  • 很遗憾,我不能这样做,因为在 VC-A 和 VC-B 之间有一个 VC。他们不是一个接一个,中间还有另一个 VC。如果我想实施这个解决方案,这意味着我必须从 VC-A 转移到 VC-Inbetween 到 VC-B
  • OK - 然后将相同的属性添加到 VC-Inbetween... 将您的 ID 字符串从 VC-A 传递到 VC-Inbetween,然后将其从 VC-Inbetween 传递到 VC-B
  • 是的,看起来就是这样,在看到答案后,我意识到通知中心不是我需要的,因为它需要 VC-B 存在且处于活动状态,这在我的情况下是不合逻辑的.
  • @S.Hasan - 如果这解决了您的问题,您应该将其标记为已接受(为了遇到它的其他用户的利益)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-24
  • 1970-01-01
  • 2012-08-30
  • 1970-01-01
相关资源
最近更新 更多