2017-08-24 7 views
1

私のUIは、特定の時間に毎日完全な色の変更を受けます。これを処理するために、私はUIColorextensionを作成し、クライアントの現地時間を切り替える各色にswitchを追加しました。したがって、ビューによってカラーが呼び出されると、時刻に応じて適切なカラーが使用されます。次に例を示します。フォアグラウンドに入るときに強制的にビューをグローバルに更新する方法はありますか?

次の場合、アプリ起動アプリデリゲートにcurrentHourを更新することに加え

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) 
    } 
} 

アプリがフォアグラウンドに入るとき、それはまた、それを更新しますアプリデリゲートで

func applicationWillEnterForeground(_ application: UIApplication) { 

    // update current hour 
    updateCurrentHour() 

} 

唯一欠けているのは、アプリケーションがフォアグラウンドに入るときにView Controller全体を強制的にリフレッシュすることで、その中のビューがUIColorにコールされ、適切な色が得られるようにすることです。

  1. ビューコントローラに強制的にビュー全体を「更新」させますか?または、UIColor(カラー更新が必要な唯一のオブジェクトであるため)を呼び出すビューだけを強制的にリフレッシュする方法はありますか?

  2. ユーザーがナビゲーションスタックの奥深くにいる場合、アプリケーションをバックグラウンドに配置してフォアグラウンドに入り、そのビューコントローラ(スタックの一番上)が正常にリフレッシュされます。ユーザーがポップバックしたときスタックを下ろす?それらのビューコントローラはリフレッシュされましたか?

  3. スタック内のユーザーの位置を失わない「グローバルリフレッシュ」を強制する方法はありますか?

+0

多分call layoutSubviews – BennX

答えて

3

この通知のためにビューコントローラを登録してください:https://developer.apple.com/documentation/foundation/nsnotification.name/1622944-uiapplicationwillenterforeground。通知が到着したら、更新します。

通知が受信されたときにビューコントローラが更新され、viewDidLoadの色が正しく表示される場合は、すべてのケースをカバーしています。ユーザーが見たビューのView Controllerはすべて、適切な色を持っています。

時計を見ている中央の場所(アプリデリゲート)からこの告知を発行して、その瞬間にアプリが開いていても瞬時に更新することができます。

+0

それは美しく働いた、ありがとう。あなたの答えの質に基づいて、私はあなたの本を購入するでしょう。 1つのフォローアップ:self.viewを「リフレッシュ/リロード/再描画」する方法はたくさんあるようですが、あなたのお勧めは何ですか? – sconewolf

+0

@sconewolf私はあなたにそれに一応答えることはできません。重要な点は、Cocoaフレームワークがあなたに送るイベントと、送信されるイベントを知ることです。適切なことが適切なタイミングで発生するコードをスロットに挿入します。 – matt

+0

ビューを再読み込みすることが何を意味するのか分かりません。ビューのプロパティを変更する必要がある場合は、変更するだけです。おそらく、それはあなたが色合いの色について知るのを助けるだろうか?ウィンドウから右下にインターフェイスを介して自動的に伝播します。 – matt

関連する問題