Swift - наблюдать за изменением элемента stati c без использования свойства обозревателя - PullRequest
0 голосов
/ 30 апреля 2020

У меня следующая ситуация: из viewDidAppear мне нужно вызывать указанную функцию c (для изменения контроллера представления на другую), когда применяется специальное условие (член stati c меняется на True, другой класс получить доступ к этому свойству stati c и отправить True, как только будут выполнены определенные условия)

Если я сделаю это так с наблюдателем свойства:

//this is property of load view controller
  static var isFilled: Bool = false {
        didSet{
            if isFilled == true {
            print("data is Filled")
                //load view controller - my present VC, which I want to switch
                var loadVC = LoadViewController()
             loadVC.changeViewController(vc: loadVC )

Это функция changeViewController:

        func changeViewController(vc: UIViewController) {
            let sb = UIStoryboard(name: "Main", bundle: nil )

            //main view controller - controller, which i want to Go to

            var mainViewController = sb.instantiateViewController(withIdentifier: "ViewController") as! ViewController
            vc.present(mainViewController, animated: true, completion: nil)
        }

Будет выдана ошибка Попытка представить viewcontroller, вид которого не находится в иерархии окон

И он выполняется внутри класса LoadViewController

Как я Понимаете, единственный способ избежать этой ошибки - вызвать функцию из viewDidApper , которая не может быть использована в этом сценарии, потому что я должен вызывать ее только при применении условия. Есть ли какие-либо альтернативы для выполнения этого без использования свойства обозревателя?

Я уверен, что есть несколько способов сделать это, и могут быть неправильные представления с моей стороны. Я довольно свободный sh разработчик и совершенно новичок в Swift. Все предложения будут высоко оценены.

1 Ответ

0 голосов
/ 01 мая 2020

Вы можете использовать NotifiationCenter, зарегистрировав уведомление и затем вызывая его всякий раз, когда вы хотите что-то обновить, например, «updateConversations» в приложении чата. Например, в viewDidLoad () зарегистрируйте свое уведомление:

NotificationCenter.default.addObserver(self, selector: #selector(self.updateConversations(notification:)), name: NSNotification.Name(rawValue: "updateConversations"), object: nil)

Добавьте эту функцию в класс:

@objc func updateConversations(notification: NSNotification) {
    if let id = notification.userInfo?["id"] as? Int,
        let message = notification.userInfo?["message"] as? String {
        // do stuff
    }
}

Используйте уведомление из любого места в вашем приложении:

let info = ["id" : 1234, "message" : "I almost went outside today."]
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "updateConversationsList"), object: self, userInfo: info)
...