NotificationCenter.default.addObserver не вызывает целевую функцию C - PullRequest
0 голосов
/ 27 апреля 2020

Я использую swift 5 на Xcode 11.0, пытаюсь передать 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- Изменить имя: NSNotification.Name ("didReceiveSession") на имя: NSNotification.Name (rawValue: "didReceiveSession") в обоих контроллерах представления

2- Создать экземпляр в view-controller-A:

2.1- share = view-controller-A ()

2.2- Изменить объект: ноль на объект: view-controller-A.share в addObserver (view-controller-B)

3- Изменить селектор в view-controller-B с селектор: #selector (self.getSessionId) на сель ector: #selector (getSessionId (_:))

Но, к сожалению, все попытки не сработали. Я не могу понять, что не так.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Ваша проблема заключается в последовательности событий.

Когда post вызывается до addObserver, ОС не может доставить уведомление, и поэтому уведомление отбрасывается.

Вы должны убедиться, что у вас есть активные наблюдатели, то есть, что addObserver вызывается до того, как вы начнете писать.

0 голосов
/ 27 апреля 2020

Это очень неправильный способ использования уведомлений.

То, что вы хотите сделать, это передать значение "sessionID" из VC-A в 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
    }
}
...