Commit 70d4e39e by Dmitriy Stepanets

Added UserDefaultsUnit properrty wrapper

parent 6914dab5
......@@ -9,7 +9,7 @@ import UIKit
import Localize_Swift
@propertyWrapper
struct UserDefaultsValue<T> {
struct UserDefaultsUnitValue<T> {
var wrappedValue: T {
get {
guard
......@@ -20,13 +20,38 @@ struct UserDefaultsValue<T> {
}
return decoded
// let value = UserDefaults.standard.value(forKey: key) as? T
// return value ?? defaultValue
}
set {
let data = NSKeyedArchiver.archivedData(withRootObject: T.self)
UserDefaults.standard.set(data, forKey: key)
if let data = try? NSKeyedArchiver.archivedData(withRootObject: newValue, requiringSecureCoding: true) {
UserDefaults.standard.set(data, forKey: key)
UserDefaults.standard.synchronize()
Settings.shared.delegate.invoke { (delegate) in
delegate.settingsDidChange()
}
}
}
}
private let key: String
private let defaultValue: T
init(wrappedValue defaultValue:T, key:String) {
self.defaultValue = defaultValue
self.key = key
}
}
@propertyWrapper
struct UserDefaultsBasicValue<T> {
var wrappedValue: T {
get {
let value = UserDefaults.standard.value(forKey: key) as? T
return value ?? defaultValue
}
set {
UserDefaults.standard.setValue(newValue, forKey: key)
UserDefaults.standard.synchronize()
}
}
......@@ -40,26 +65,31 @@ struct UserDefaultsValue<T> {
}
}
protocol SettingsDelegate:class {
func settingsDidChange()
}
class Settings {
static let shared = Settings()
let delegate = MulticastDelegate<SettingsDelegate>()
private init() {}
@UserDefaultsValue(key: "app_theme")
@UserDefaultsBasicValue(key: "app_theme")
var appTheme = AppTheme.system
@UserDefaultsValue(key: "app_theme_auto")
@UserDefaultsBasicValue(key: "app_theme_auto")
var automaticSwitchTheme = false
@UserDefaultsValue(key: "temperature_type")
@UserDefaultsUnitValue(key: "temperature_type")
var temperatureType = UnitTemperature.celsius
@UserDefaultsValue(key: "wind_speed_type")
@UserDefaultsUnitValue(key: "wind_speed_type")
var windSpeedType = UnitSpeed.milesPerHour
@UserDefaultsValue(key: "pressure_type")
@UserDefaultsUnitValue(key: "pressure_type")
var pressureType = UnitPressure.millibars
@UserDefaultsValue(key: "distance_type")
@UserDefaultsUnitValue(key: "distance_type")
var distanceType = UnitLength.miles
var locale:Locale {
......
......@@ -55,6 +55,10 @@ class SettingsDetailsCellFactory: CellFactoryProtocol {
break
}
if numberOfRows(inSection: 1) == 1 {
mask = [.layerMinXMinYCorner, .layerMaxXMinYCorner, .layerMinXMaxYCorner, .layerMaxXMaxYCorner]
}
switch viewModel.rowType {
case .temperature:
cell.configure(item: viewModel.temperatures[indexPath.row].name,
......
......@@ -31,6 +31,17 @@ class SettingsDetailsViewController: UIViewController {
self.viewModel.delegate = self
prepareController()
prepareTable()
updateUI()
}
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
updateUI()
}
private func updateUI() {
tableView.backgroundColor = ThemeManager.currentTheme.baseBackgroundColor
self.view.backgroundColor = ThemeManager.currentTheme.baseBackgroundColor
}
}
......
......@@ -29,6 +29,7 @@ class SettingsViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
viewModel.delegate = self
prepareController()
prepareTableView()
updateUI()
......@@ -81,6 +82,13 @@ private extension SettingsViewController {
}
}
//MARK:- ViewModel Delegate
extension SettingsViewController: ViewModelDelegate {
func viewModelDidChange<P>(model: P) where P : ViewModelProtocol {
tableView.reloadData()
}
}
//MARK:- UITableView Data Source
extension SettingsViewController: UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
......
......@@ -11,4 +11,14 @@ import UIKit
class SettingsViewModel: ViewModelProtocol {
let settings = Settings.shared
weak var delegate:ViewModelDelegate?
init() {
settings.delegate.add(delegate: self)
}
}
extension SettingsViewModel: SettingsDelegate {
func settingsDidChange() {
self.delegate?.viewModelDidChange(model: self)
}
}
import Foundation
import UIKit
let testData = try NSKeyedArchiver.archivedData(withRootObject: UnitTemperature.celsius, requiringSecureCoding: true)
......@@ -21,7 +21,7 @@
<key>Cirque.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>4</integer>
<integer>3</integer>
</dict>
<key>Localize-Swift.xcscheme</key>
<dict>
......@@ -33,7 +33,7 @@
<key>Localize-Swift.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>3</integer>
<integer>4</integer>
</dict>
<key>Pods-1Weather.xcscheme</key>
<dict>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment