如何刷新标签文本

How do I refresh a labels text

我有一个应用程序有一个标签,用于显示本质上是时间戳的内容。基本上,当用户启动我的应用程序时,起始页有 3 个按钮。时间戳标签将显示在上次使用的按钮上(例如,上次锻炼:昨天或上次锻炼:2 天前)。

将标签的字符串与通过 UserDefaults 保存的日期与当前日期进行比较以获取差异(例如,今天、昨天、2 天前、10 天前、32 天前等)。我有 运行 这个检查和更新发生在我能想到的每个地方的标签的功能,以便在应用程序启动时更新它:viewWillAppearviewDidAppearviewDidLoad

问题是应用程序在启动时并不总是重新加载,因为 iOS 使其在后台保持“打开”状态。所以我的标签不会更新,除非我更改选项卡并返回到此开始选项卡以便调用 viewWillAppear。话虽如此,但有时出于某种原因,它确实会重新加载并再次显示启动画面,但并非总是如此,而且我不知道为什么它会这样做...

我能做些什么来强制重新加载标签或 运行 函数,无论 viewWillAppearviewDidAppearviewDidLoad 是否被调用?

谢谢!

在app delegate中可以调用

func applicationWillEnterForeground(_ application: UIApplication) {

}

每当应用程序打开时都会调用此方法

该应用有时会重新加载启动画面,因为 iPhone 会自动关闭后台占用过多内存的应用。因此,如果您在后台运行某个应用程序并执行一些内存密集型操作,您可以期望该应用程序在您返回时刷新。

appDelegate 中有一个委托方法,可在用户将应用程序置于后台或前台时通知应用程序。您可以通过通知收听此内容,并在用户进入前台时重新加载您的标签。

func applicationWillEnterForeground(_ application: UIApplication) {

}

在 applicationWillEnterForeground 中使用观察者接收器模式来更新标签。

使用通知观察者模式

首先,设置通知以了解应用程序何时进入前台状态:

func sceneWillEnterForeground(_ scene: UIScene) {
    NotificationCenter.default.post(name: Notification.Name("sceneWillEnterForeground"), object: nil)
}

注意:从 iOS13 开始,所需的函数在 SceneDelegate 文件中,而不是在 AppDelegate 中。


接下来,监听该通知并通过在需要此类通知的地方添加一个观察者来响应(例如在 viewDidLoad() 中):

NotificationCenter.default.addObserver(self, selector: #selector(willEnterForeground), name: Notification.Name("sceneWillEnterForeground"), object: nil) 

注意:通知名称必须与您在 SceneDelegate.swift 文件中创建的名称相匹配。


最后,创建上面提到的选择器。添加将执行以响应 willEnterForeground 通知的代码:

@objc func willEnterForeground() {
    // Update your label here
}

注意:此处的函数名称必须与上面的选择器名称匹配。


这个 link 适用于一个使用通知观察者模式的小型应用程序,如果您觉得一个工作示例会有所帮助: https://github.com/PepperoniJoe/MusicWithColor