現状と質問
現在ViewControllerから3つのSliderでNavigationControllerとTabBarControllrtのTabBarの背景を
RGB変更をNotificationを使い変更をSecondViewControllerに反映しています。
しかし、このままだと再ビルドで初期状態に戻ってしまうので保存をしたいのですが、
アプリの本体設定の保存はUserDefaultsで良い、よく使う。と見る事が多々あります。
NotificationではNameを持たせていますが、UserDefaultsでもforkeyを持たせるので
以下のコードでいうcolor定数に二つの通知、変更を持たせるのは不可能だと思うのですが、
それぞれのsetとpostを呼ぶタイミングは同じ気がするのでどうしたらよろしいのでしょうか?
試しにUserDefaultsのみでやるとエラーが出たので違う気がします。
UserDefaultsのコメントアウトしたところもコメントインして行っても保存はされませんでした。
import UIKit class ViewController: UIViewController { @IBOutlet weak var redSlider: UISlider! @IBOutlet weak var greenSlider: UISlider! @IBOutlet weak var blueSlider: UISlider! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. redSlider.value = 0.5 greenSlider.value = 0.5 blueSlider.value = 0.5 changeTabBackgroundColor(red: redSlider.value, green: greenSlider.value, blue: blueSlider.value) // isTranslucet == false だと色の変更が効かない tabBarController?.tabBar.isTranslucent = true // UITabBar の背景を入れ替える //UITabBar.appearance().backgroundImage = UIImage() tabBarController?.tabBar.backgroundImage = UIImage() } @IBAction func sliderValueChange(_ sender: UISlider) { changeTabBackgroundColor(red: redSlider.value, green: greenSlider.value, blue: blueSlider.value) changeNavigationBacgroundColor(red: redSlider.value, green: greenSlider.value, blue: blueSlider.value) let color = UIColor(red: CGFloat(redSlider.value), green: CGFloat(greenSlider.value), blue: CGFloat(blueSlider.value), alpha: 1.0) let userInfo = [ "color" : color ] //UserDefaults.standard.set(color, forKey: "backgroundColor") NotificationCenter.default.post(name: NSNotification.Name(rawValue: "colorChangeValue"), object: nil, userInfo: userInfo) } func changeTabBackgroundColor(red: Float, green: Float, blue: Float) { tabBarController?.tabBar.backgroundColor = UIColor(red: CGFloat(red), green: CGFloat(green), blue: CGFloat(blue), alpha: 1.0) } func changeNavigationBacgroundColor(red: Float, green: Float, blue: Float) { self.navigationController?.navigationBar.backgroundColor = UIColor(red: CGFloat(red), green: CGFloat(green), blue: CGFloat(blue), alpha: 1.0) } }
import UIKit class SecondViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() NotificationCenter.default.addObserver(forName: Notification.Name(rawValue: "colorChangeValue"), object: nil, queue: nil) { [weak self] (notice) in if let color = notice.userInfo?["color"] as? UIColor { // self?.navigationController?.navigationBar.backgroundColor = color self?.navigationController?.navigationBar.backgroundColor = UserDefaults.standard.object(forKey: "backgroundColor") as! UIColor } } } }
回答1件
あなたの回答
tips
プレビュー