Отправка логического значения между UIViewControllers с использованием NotificationCenter и Observer

#ios #swift

#iOS #swift

Вопрос:

У меня есть 2 класса, и я пытаюсь использовать NotificationsCenter и Observers для отправки логического значения. Если логическое значение отправлено правильно, я хочу перемещаться по ViewController. Но, к сожалению, моя функция из Observer ( checkIsUserFromChecklist ) по некоторым причинам не запускается. Вот мой код:

 extension Notification.Name {
    static let isAccessedFromChecklistVC = Notification.Name(rawValue: "isAccessedFromChecklistVC")
}

// Class where I want to check if the boolean is changed
class ChecklistVC: UIViewController {

    var isAccessedFromChecklist = true

    override func viewDidLoad() {
        super.viewDidLoad()
        NotificationCenter.default.post(name: .isAccessedFromChecklistVC, object: isAccessedFromChecklist)
    }
    //…
    //…
    //…
}

// Class where I want to get the value of the boolean

class FullscreenImageVC: UIViewController {

    var isAccessedFromChecklistVC = false

    // Remove observer from memory after we use it
    deinit {
        NotificationCenter.default.removeObserver(self)
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        createObservers()
    }

    func createObservers(){

        NotificationCenter.default.addObserver(self,
                                               selector: #selector(checkIfIsAccessedFromChecklist),
                                               name: .isAccessedFromChecklistVC,
                                               object: nil)
    }

    @objc func checkIfIsAccessedFromChecklist(_ notification: Notification){

        if let object = notification.object as? Bool{
            print("Object status: (object)") // Is never entering here.

            isAccessedFromChecklistVC = object
        }
    }

    func navigateToChecklist(){

        if isAccessedFromChecklistVC == true {
            let checklistVC = self.storyboard?.instantiateViewController(withIdentifier: "ChecklistVC") as! ChecklistVC
            self.navigationController?.setViewControllers([self.navigationController!.viewControllers.first!, checklistVC], animated: true)
        }
    }
}

  

Спасибо, если вы это прочитаете.

Комментарии:

1. Ваш наблюдающий контроллер представления не отслеживает, когда создается сообщение, потому что кодирование самого уведомления в порядке. Кстати, вы не смогли найти лучшего способа для взаимодействия этих двух контроллеров просмотра?

Ответ №1:

Похоже, что это сообщение происходит

 NotificationCenter.default.post(name: .isAccessedFromChecklistVC, object: isAccessedFromChecklist)
  

перед FullscreenImageVC регистрацией vc в качестве наблюдателя

 NotificationCenter.default.addObserver(self,
                 selector: #selector(checkIfIsAccessedFromChecklist),
                 name: .isAccessedFromChecklistVC
                 object: nil)
  

Поэтому убедитесь, что вы делаете публикацию, когда активен второй vc