我的用户界面每天都会在特定时间进行彻底的换色。为了解决这个问题,我创建了一个UIColor
extension
,并在每种颜色上添加switch
,以打开客户端当前的本地时间。因此,无论何时视图调用颜色,它都会根据一天中的时间使用适当的颜色。这是一个例子:
UIColor扩展程序
// text color
public class var text: UIColor {
switch currentHour {
case 0...5, 20...23: // from 8 PM to 5:59 AM
return UIColor(red: 255/255, green: 255/255, blue: 255/255, alpha: 1)
default: // from 6 AM to 7:59 PM
return UIColor(red: 0/255, green: 0/255, blue: 0/255, alpha: 1)
}
}
除了在应用启动时更新应用代理中的currentHour
,它还会在应用进入前台时更新它:
在app delegate
中func applicationWillEnterForeground(_ application: UIApplication) {
// update current hour
updateCurrentHour()
}
唯一缺少的是当应用程序进入前景时强制刷新整个视图控制器,以便其中的视图被强制调用UIColor
并获得适当的颜色。
如何强制视图控制器刷新"它的整个观点?或者有没有办法强制刷新仅调用UIColor
的视图(因为它们是唯一需要颜色更新的对象)?
如果用户深入导航堆栈,则将应用程序置于后台然后进入前台,并且该视图控制器(位于堆栈顶部)已成功刷新,当用户弹出时会发生什么回到堆栈?这些视图控制器是否刷新了?
或者有没有办法强制进行全球刷新"那不会失去用户在筹码中的位置吗?
答案 0 :(得分:3)
让视图控制器注册此通知:https://developer.apple.com/documentation/foundation/nsnotification.name/1622944-uiapplicationwillenterforeground。通知到达后,刷新。
如果视频控制器在收到通知时刷新并且在viewDidLoad
中获得正确的颜色,则表示您已涵盖所有可能的情况。用户所见过的所有视图控制器都具有正确的颜色。
您可能还想从一些正在观看时钟的中心位置(即应用代表)自己发出此通知,这样即使应用程序在此时打开,您也会在到达时刻时刷新。