2017-08-24 67 views
1

我的用戶界面在特定時間每天都會發生完整的顏色變化。爲了解決這個問題,我創建了一個UIColorextension,並在每種顏色上添加了一個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

在應用程序代表

func applicationWillEnterForeground(_ application: UIApplication) { 

    // update current hour 
    updateCurrentHour() 

} 

唯一缺少的是當應用程序進入前臺時強制刷新整個視圖控制器,以使其中的視圖被迫調用UIColor並獲取其合適的顏色。

  1. 如何強制視圖控制器「刷新」其整個視圖?或者,有沒有辦法強制刷新UIColor上的視圖(因爲它們是唯一需要更新顏色的對象)?

  2. 如果用戶深入導航堆棧,將應用程序置於後臺,然後進入前臺,並且該視圖控制器(在堆棧的頂部)被成功刷新,當用戶彈出時會發生什麼下了堆棧?那些視圖控制器是否刷新?

  3. 還是有辦法強制一個「全局刷新」,不會失去用戶在他們的堆棧位置?

+0

也許致電layoutSubviews – BennX

回答

3

讓您的視圖控制器註冊此通知:https://developer.apple.com/documentation/foundation/nsnotification.name/1622944-uiapplicationwillenterforeground。當通知到達時,刷新。

如果視圖控制器在接收到該通知時刷新,並且還獲取其viewDidLoad中的顏色,則說明了所有可能的情況。所有視圖控制器的用戶所看到的視圖都將具有正確的顏色。

您可能還想從一些中心位置(即應用程序委託人)自己發出此通知,該通知正在觀看時鐘,以便即使在該時刻該應用程序處於打開狀態時即刻刷新。

+0

它工作得很好,謝謝。根據你答案的質量,我會購買你的書。一個後續:似乎有很多方法來「刷新/重新加載/重繪」self.view,你的建議是什麼? – sconewolf

+0

@sconewolf我無法給你一個一目瞭然的答案。關鍵是:瞭解Cocoa框架希望向您發送什麼事件,以及何時發送這些事件;插入你的代碼,在正確的時間發生正確的事情。 – matt

+0

我不知道重新加載視圖意味着什麼。如果您必須更改視圖的屬性,則只需更改它。也許它會幫助你瞭解色彩的顏色?它會自動從窗口向下通過界面傳播。 – matt

相關問題