【问题标题】:ViewDidAppear not executed every time app comes to foreground每次应用程序进入前台时都不会执行 ViewDidAppear
【发布时间】:2016-12-13 22:46:12
【问题描述】:

我正在使用 Arduino 板构建一个 IoT 应用程序并调用 API 来检查 Arduino 板的更新引脚值。

当我收到来自 API 的更新时,我必须根据收到的数据将按钮颜色更新为红色或绿色。我第一次加载应用程序时它工作得很好,viewDidAppear() 被调用。但是当我转到后台然后再次转到前台时,它不会被调用。我所知道的是,每次视图出现时,它都必须在函数内部运行指令,但似乎并非如此。

我试图将我的代码放在AppDelagateapplicationDidBecomeActive() 中,但是因为我正在尝试更新我的视图并且视图还不存在,所以它给了我发现 nil 的致命错误。 这是我在viewDidAppear()中的说明

    override func viewDidAppear(_ animated: Bool) {

    activityIndicator.startAnimating()

    definingPinModes(pin: [7,6,5,4], mode: 1)

    getAllInputValues(key: key, method: .post) { (status, newValues, msg) in

        if status == 200 {
            //Change button colors according to values in array
            self.changeButtonColors(values: newValues!)

        } else {

            print("Error getting pin values")

            self.alertMessage(title: "Connection Error", message: "Failed retrieving pin values")
            return
        }
        self.activityIndicator.stopAnimating()
    }

}

【问题讨论】:

    标签: ios swift viewdidappear


    【解决方案1】:

    除了viewDidAppear,您还可以让您的视图控制器观察UIApplication.didBecomeActiveNotification(以前称为UIApplicationDidBecomeActive):

    private var observer: NSObjectProtocol?
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        observer = NotificationCenter.default.addObserver(forName: UIApplication.didBecomeActiveNotification, object: nil, queue: .main) { [weak self] notification in
            self?.updateUI()
        }
    }
    
    deinit {
        if let observer = observer {
            NotificationCenter.default.removeObserver(observer)
        }
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        updateUI()
    }
    
    private func updateUI() {
        // do your UI update stuff here
    }
    

    【讨论】:

    • 感谢 Rob 第一次使用这些观察者。但是我有一个关于创建 NotificationCenter 本身的实例的问题。我没有创建实例并且不需要调用 deinit 就做到了。为什么你的方式比直接使用 NotificationCenter 类更好?
    • 我没有创建NotificationCenter 实例。我只是使用default 单例。我所做的只是向该通知中心添加一个观察者并保存对该观察者(不是中心)的引用,以便我可以在deinit 中删除该观察者。就你为什么这样做而言,从历史上看,当一个对象被释放时,它通知通知中心停止向它发送通知是至关重要的。现在也许这是一个不会被释放的根视图控制器,但最好自己清理一下,这样代码就可以在任何上下文中使用。
    • 参见addObserver(forName:object:queue:using:) 文档,了解添加和删除观察者的示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多