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- 在 view-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-B
当 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
}
}
你的问题出在先后顺序上。
当 post
在 addObserver
之前调用时,OS 没有地方可以传递通知,因此通知被丢弃。
您需要确保您有一个活跃的观察者,即在您执行 `post.
之前调用 addObserver
我在 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- 在 view-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-B
当 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
}
}
你的问题出在先后顺序上。
当 post
在 addObserver
之前调用时,OS 没有地方可以传递通知,因此通知被丢弃。
您需要确保您有一个活跃的观察者,即在您执行 `post.
之前调用addObserver