NotificationCenter не работает в первый раз, когда он публикуется из viewcontroller в другой ViewController - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть 2 ViewController, называемых ViewController1 и ViewController2.

Я отправляю уведомление из ViewController1 в ViewController2, но в первый раз, когда он публикуется, в первый раз NotificationCenter не работает.

Когда я вернулся из ViewController2 в ViewController1, а затем снова, если попытаться переместить ViewController2, тогда NotificationCenter работает,

// ViewController1.swift

import UIKit

class ViewController1: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()

}

//Move to next VC
@IBAction func nextButtonClicked(_ sender: Any) {

    NotificationCenter.default.post(name: Notification.Name("callMethodPrint1FromVC2"), object: nil)

    let storyBoard = UIStoryboard(name: "Main", bundle: nil)
    let vc2 = storyBoard.instantiateViewController(withIdentifier: "ViewController2Id") as? ViewController2
    navigationController?.pushViewController(vc2!, animated: true)

  } 
}

// ViewController2.swift

import UIKit

class ViewController2: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.


}

override func viewWillAppear(_ animated: Bool) {
    //Recieve notification
    NotificationCenter.default.addObserver(self, selector: #selector(self.print1Method(notification:)), name: Notification.Name("callMethodPrint1FromVC2"), object: nil)
}

@objc func print1Method(notification: Notification) {

    print("Notification came from VC 1")
}

@IBAction func backToVC1(_ sender: Any) {

    let storyBoard = UIStoryboard(name: "Main", bundle: nil)
    let vc2 = storyBoard.instantiateViewController(withIdentifier: "ViewController1Id") as? ViewController1
    navigationController?.pushViewController(vc2!, animated: true)
}

 //Remove notification object
deinit {

    NotificationCenter.default.removeObserver(self, name: Notification.Name("callMethodPrint1FromVC2"), object: nil)
}

}

Фактический вывод :

Когда я перемещаю ViewController1 в ViewController2 в первый раз и каждый раз, метод print1Method из ViewController2 должен вызывать.

Но это не работает, как ожидалось.Есть ли в моем коде проблемы с Anu или я что-то упустил?

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

Он не будет вызываться, потому что ViewController2 не загружен, и будет вызываться во второй раз, потому что вы выполняете Push вместо Pop при перемещении назад, что, в свою очередь, остается ViewController1 в памяти.

Вместо удаления уведомленийи вызовите print1Method из ViewController2 Viewdidload / ViewWillappear / Viewdidappear в зависимости от ваших потребностей.сохраните некоторую открытую переменную в ViewController2 и присвойте значение в методе prepareforsegue в ViewController1, если вы хотите передать некоторые данные из ViewController1 в ViewController2

и заменить:

@IBAction func backToVC1(_ sender: Any) {

     let storyBoard = UIStoryboard(name: "Main", bundle: nil)
     let vc2 = storyBoard.instantiateViewController(withIdentifier: "ViewController1Id") as? ViewController1
     navigationController?.pushViewController(vc2!, animated: true)
}

на

@IBAction func backToVC1(_ sender: Any) {
    navigationController?.popViewController(animated: true)
}
0 голосов
/ 24 сентября 2019

вы отправляете уведомление до инициализации контроллера представления.

нет необходимости отправлять уведомление для вызова метода vc2.вместо этого непосредственно вызовите метод.

В VC1

@IBAction func nextButtonClicked(_ sender: Any) {

     let storyBoard = UIStoryboard(name: "Main", bundle: nil)
     let vc2 = storyBoard.instantiateViewController(withIdentifier:"ViewController2Id") as ViewController2
     vc2.print1Method()
     navigationController?.pushViewController(vc2!, animated: true)

  } 
}

В VC2

func print1Method() {

     print("Method called from VC 1")
 }

также для кнопки возврата вы делаете это неправильно.просто вытолкните контроллер представления из стека

 @IBAction func backToVC1(_ sender: Any) {

     self.navigationController?.popViewController(animated: true)
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...