Swift - 当应用程序进入后台状态时,从 AppDelegate 更新 RootViewController 中的值

Posted

技术标签:

【中文标题】Swift - 当应用程序进入后台状态时,从 AppDelegate 更新 RootViewController 中的值【英文标题】:Swift - Update a value in RootViewController from AppDelegate when the app comes to background state 【发布时间】:2016-07-26 13:02:30 【问题描述】:

我有一个只有一个主视图的简单视图应用程序。

当应用进入后台状态时,我试图在视图内的标签中显示更新的时间值。

场景是:

1 - 单视图应用程序项目

2 - 只有一个 View (ViewController) 带有一个 Label 来显示日期

3 - 在 AppDelegate:applicationWillEnterForeground 中获取当前时间

func applicationWillEnterForegound(application: UIAPplication)
    var date:String = GetDate()
    --> update View Label with date here

4 - 在 ViewController 上显示当前时间

我正在尝试使用委托,但问题是视图是应用程序中的最后一个可见元素,并且 viewDidLoad、viewWillAppear 等方法被调用一次。

【问题讨论】:

这种情况下最好使用NSNotification 【参考方案1】:

正如其他人所指出的,您可以使用 Notification 框架在您的视图控制器中执行此操作,这样您的 appDelegate 就不需要引用您的视图控制器。在你的控制器中添加这样的一行:

NSNotificationCenter.defaultCenter().addObserver(self,
    selector: #selector(appWillEnterForeground), 
    name: NSNotification.Name.UIApplicationWillEnterForeground,
    object: nil 

在 Swift 3 中,语法略有变化:

NotificationCenter.default.addObserver(self, 
    selector: #selector(appWillEnterForeground),
    name: NSNotification.Name.UIApplicationWillEnterForeground,
    object: nil)

在 Swift 4.2 中,语法再次发生变化:

NotificationCenter.default.addObserver(self, 
    selector: #selector(appWillEnterForeground), 
    name: UIApplication.willEnterForegroundNotification, 
    object: nil)

然后在选择器中定义你命名的函数:

@objc func appWillEnterForeground() 
   //...

【讨论】:

非常感谢,这很有帮助 对 swift3 的额外小改动:名称:Notification.Name.UIApplicationWillEnterForeground, 既然你是在观察某些东西进入后台之后,什么时候会移除观察者? viewDidDisapear 进入后台时不会删除观察者吗?【参考方案2】:

您可以在ViewController 中收听UIApplicationWillEnterForegroundNotification。如果您知道它的视图是可见的,它可以找到日期并更改自己的标签。

【讨论】:

谢谢,根据您的回答,我搜索了有关听众的信息,发现了有趣的讨论。【参考方案3】:

谢谢大家的回答。我现在在主视图中实现了一个通知并解决了问题。

override func viewDidLoad()
    super.viewDidLoad()

    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.updateDate), name: UIApplicationWillEnterForegroundNotification, object: nil)


func updateDate()
    labelInfo.text = theDate

谢谢

【讨论】:

以上是关于Swift - 当应用程序进入后台状态时,从 AppDelegate 更新 RootViewController 中的值的主要内容,如果未能解决你的问题,请参考以下文章

当应用程序进入暂停状态时取消本地通知。(从后台删除)

应用程序进入后台时如何保持 Swift Socket IO 运行?

进入后台状态ios swift时防止websocket连接断开

在swift中,当应用程序进入后台时,如何使用依赖注入保存变量?

Swift:当应用程序进入后台时启动另一个计时器

当应用程序进入后台和前台时,带有通知中心的登录屏幕,Swift