【问题标题】:Swift - observe static member change, without using property observerSwift - 观察静态成员的变化,而不使用属性观察器
【发布时间】:2020-08-15 03:54:04
【问题描述】:

我有下一个情况:当应用特殊条件时(静态成员更改为 True,另一个类访问此静态属性并发送),我必须从 viewDidAppear 调用特定函数(将视图控制器更改为另一个)满足特定条件时为真)

如果我对属性观察者这样做:

//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)
        }

它会抛出一个错误试图呈现视图不在窗口层次结构中的视图控制器

而且,它是在 LoadViewController 类中执行的

据我了解,避免此错误的唯一方法是从 viewDidApper 调用该函数,在这种情况下无法使用该函数,因为我必须仅在应用条件时调用它. 是否有任何替代方法可以在不使用属性观察器的情况下执行该操作?

我确信有多种方法可以执行此操作,而且我这边可能存在误解。我是一个非常新的开发人员,对 Swift 完全陌生。非常感谢所有建议。

【问题讨论】:

  • loadVC 永远不会被展示
  • @nighttalker 嘿,感谢您的快速回复。我将在问题中添加更多细节以使其更清楚。

标签: ios swift observer-pattern observers


【解决方案1】:

您可以通过注册通知来使用 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)

【讨论】:

  • 很高兴帮助@AndreyFr!如果有机会,请接受并支持我的回答。
猜你喜欢
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
  • 2017-09-07
  • 1970-01-01
  • 1970-01-01
  • 2013-10-24
  • 2018-10-28
  • 1970-01-01
相关资源
最近更新 更多