我在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
被调用了。