Created
May 14, 2021 18:16
-
-
Save christianselig/df08d6995f87493ba5d0a0dbe127c37c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// ContentView.swift | |
// TestSwiftSettings3 | |
// | |
// Created by Christian Selig on 2021-05-13. | |
// | |
import SwiftUI | |
import Combine | |
struct Setting { | |
enum SettingType { | |
case toggle | |
case menu(items: [String]) | |
} | |
let title: String | |
let iconName: String | |
let key: String | |
let type: SettingType | |
} | |
struct ContentView: View { | |
var settings: [Setting] = [ | |
Setting(title: "I Like Ants", iconName: "ant.fill", key: "likes-ants", type: .toggle), | |
Setting(title: "Ant Type", iconName: "folder.fill", key: "ant-type", type: .menu(items: ["Fluffy", "Furry", "Scaley"])) | |
] | |
var body: some View { | |
Form { | |
Section { | |
ForEach(settings, id: \.key) { (setting) in | |
switch setting.type { | |
case .toggle: | |
ToggleSettingView(setting: setting) | |
case .menu: | |
MenuSettingView(setting: setting) | |
} | |
} | |
} | |
} | |
} | |
} | |
struct ToggleSettingView: View { | |
let setting: Setting | |
var body: some View { | |
Toggle(isOn: getBinding(for: setting), label: { | |
HStack { | |
Image(systemName: setting.iconName).foregroundColor(.pink) | |
Text(setting.title) | |
} | |
}) | |
} | |
func getBinding(for setting: Setting) -> Binding<Bool> { | |
return Binding<Bool>( | |
get: { | |
UserDefaults.standard.bool(forKey: setting.key) | |
}, | |
set: { (value) in | |
UserDefaults.standard.set(value, forKey: setting.key) | |
} | |
) | |
} | |
} | |
struct MenuSettingView: View { | |
let setting: Setting | |
var body: some View { | |
HStack { | |
Button(action: { | |
// What do do on button press? e.g.: set it to option "Scaley" which is at index 2? | |
}, label: { | |
HStack { | |
Image(systemName: setting.iconName).foregroundColor(.pink) | |
Text(setting.title).foregroundColor(.black) | |
Spacer() | |
Text(menuItems[getBinding(for: setting).wrappedValue]).foregroundColor(.gray) | |
} | |
}) | |
} | |
} | |
var menuItems: [String] { | |
switch setting.type { | |
case .menu(let items): | |
return items | |
default: | |
fatalError("Should be menu type") | |
} | |
} | |
func getBinding(for setting: Setting) -> Binding<Int> { | |
return Binding<Int>( | |
get: { | |
UserDefaults.standard.integer(forKey: setting.key) | |
}, | |
set: { (value) in | |
UserDefaults.standard.set(value, forKey: setting.key) | |
} | |
) | |
} | |
} | |
struct ContentView_Previews: PreviewProvider { | |
static var previews: some View { | |
ContentView() | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment