【发布时间】: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- 在 view-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 ...上设置断点。这会触发吗?此外,在post和addObserver调用上设置断点。addObserver是在post之前触发的吗? -
@Gereon 我确实在处理函数上设置了一个断点,这就是我知道它没有被调用的方式。我还在帖子和 addObserver 上设置了一个断点,帖子在 addObserver 之前被触发,所以没有任何可疑之处。
-
相反。如果
post在addObserver之前触发,谁会观察通知? -
那么 addObserver 应该在 post 之前触发?
-
当然。如果没有,则操作系统没有地方可以将通知传递到,它会立即被丢弃。