Speichern mehrerer UIswitch states

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Speichern mehrerer UIswitch states

    Hallo zusammen,

    ich erlerne gerade das Programmieren mit Swift5 und stehe vor einem Problem. welches ich nicht zu lösen vermag.

    Ich habe einen ViewController, in dem sich 3 UISwitches befinden.
    Stellt man einen auf .isON == true, sind die beiden anderen automatisch auf .isON = false.

    So weit so gut, das funtktioniert auch,
    Nun will ich aber den Switch state aller drei Switches auch speichern, wenn ich auf den "unwindStops" Button tippe um zum verherigen View zurück zu kehren.
    Das funktioniert zwar grundsätzlich, aber nur wenn ich die Switches auch wirklich einzeln ein oder ausschalte, is.On = false wird einfach nicht gespeichert,
    Der zuletzt betätigte Switch bleibt immer auf .isON

    Hier der Code, soweit ich ihn bisher geschrieben hab

    Quellcode

    1. import UIKit
    2. class SelectStops: UIViewController {
    3. @IBOutlet weak var oneStopSwitch: UISwitch!
    4. @IBOutlet weak var halfStopSwitch: UISwitch!
    5. @IBOutlet weak var thirdStopSwitch: UISwitch!
    6. let switchDelfault = UserDefaults.standard
    7. @IBAction func unwindStops(_ sender: UIStoryboardSegue) {
    8. dismiss(animated: true, completion: nil)
    9. }
    10. override func viewDidLoad() {
    11. super.viewDidLoad()
    12. oneStopSwitch.isOn = switchDelfault.bool(forKey: "switchState1")
    13. halfStopSwitch.isOn = switchDelfault.bool(forKey: "switchState2")
    14. thirdStopSwitch.isOn = switchDelfault.bool(forKey: "switchState3")
    15. }
    16. @IBAction func oneStopSwitchChanged(_ sender: UISwitch) {
    17. if sender.isOn == true {
    18. halfStopSwitch.isEnabled = false
    19. thirdStopSwitch.isEnabled = false
    20. } else if oneStopSwitch.isOn == false && halfStopSwitch.isOn == false && thirdStopSwitch.isOn == false {
    21. oneStopSwitch.isOn = true
    22. }
    23. switchDelfault.set(sender.isOn, forKey: "switchState1")
    24. }
    25. @IBAction func halfStopSwitchChanged(_ sender: UISwitch) {
    26. if sender.isOn == true {
    27. oneStopSwitch.isOn = false
    28. thirdStopSwitch.isOn = false
    29. } else if oneStopSwitch.isOn == false && halfStopSwitch.isOn == false && thirdStopSwitch.isOn == false {
    30. halfStopSwitch.isOn = true
    31. }
    32. switchDelfault.set(sender.isOn, forKey: "switchState2")
    33. }
    34. @IBAction func thirdStopSwitchChanged(_ sender: UISwitch) {
    35. if sender.isOn == true {
    36. oneStopSwitch.isOn = false
    37. halfStopSwitch.isOn = false
    38. } else if oneStopSwitch.isOn == false && halfStopSwitch.isOn == false && thirdStopSwitch.isOn == false {
    39. thirdStopSwitch.isOn = true
    40. }
    41. switchDelfault.set(sender.isOn, forKey: "switchState3")
    42. }
    43. }
    Alles anzeigen
    Wie schaffe ich es, dass alle Switches automatsch gespeichert werden?

    BItte verzeiht mir die für Euch wahrscheinlich relativ simple Frage, wie gesagt, ich lerne gerade.

    VIelen Dank und Grüße,
    Wolfgang
  • Vielen Dank für den Ratschlag, so einfach kann es sein. ^^

    Quellcode

    1. @IBAction func thirdStopSwitchChanged(_ sender: UISwitch) {
    2. if sender.isOn == true {
    3. oneStopSwitch.isOn = false
    4. halfStopSwitch.isOn = false
    5. } else if oneStopSwitch.isOn == false && halfStopSwitch.isOn == false && thirdStopSwitch.isOn == false {
    6. thirdStopSwitch.isOn = true
    7. }
    8. saveswitches()
    9. }
    10. func saveswitches() {
    11. switchDelfault.set(oneStopSwitch.isOn, forKey: "switchStateOne")
    12. switchDelfault.set(halfStopSwitch.isOn, forKey: "switchStateHalf")
    13. switchDelfault.set(thirdStopSwitch.isOn, forKey: "switchStateThird")
    14. }
    Alles anzeigen
    Als Anfänger fällt nun mal manches noch ein bisschen schwer...
  • Ich habe leider doch noch ein kleines Problem, welches mir zuvor nicht aufgefallen war.
    Und zwar wird, wenn ich die App zum ersten mal starte, der OneStepSwitch plötzlich auf "false" gesetzt?
    Dies war mir erst aufgefallen, als ich die App im Simulator gelöscht, und neu gestartet habe.
    Im Attribut Inspector ist er allerdings auf "on" gestellt.
    Warum ist das so?

    oneStopSwitch.jpg
    Eigentlich sollte er beim ersten Start der App dann doch auch auf "on" stehen?

    Erstelle ich ein neues Projekt, ganz ohne Code, bleib er das auch, nur in meinem Projekt leider nicht mehr.
    Was mache ich da falsch, bzw. wie schaffe ich es, dass dieser Switch beim ersten Start der App auf .isON = true ist?
  • Wolfgang1973 schrieb:

    Und zwar wird, wenn ich die App zum ersten mal starte, der OneStepSwitch plötzlich auf "false" gesetzt?
    Du setzt den Switch ja im viewDidLoad anhand der UserDefaults. Dort ist der entsprechende Key bei einer neu installierten App nicht vorhanden und der zurückgegebene Bool-Wert daher false.

    Du müsstest entweder abfangen, ob der Schlüssel in den UserDefaults tatsächlich vorhanden ist, oder (empfohlener Weg) für alle Werte, die aus den UserDefaults gelesen werden, einen Standardwert registrieren. Dann wird dieser genommen, falls kein Wert vorliegt. Als Nebeneffekt wird ein Wert gleich dem Standardwert auch nicht geschrieben, was die .plist-Datei der App klein und übersichtlich hält.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Ok, das wusste ich nicht, ich dachte, solange die App noch nie gestartet wurde, ist da auch nichts in den default Werten.

    Nun habe ich mich meine "Hausaufgaben" gemacht, und mir folgendes überlegt.
    Es funktioniert zwar, aber ich bin mir nicht sicher, ob das alles nicht völliger Müll ist der zwar funktioniert aber so nicht programmiert werden sollte.

    Quellcode

    1. import UIKit
    2. class SelectStops: UIViewController {
    3. @IBOutlet weak var oneStopSwitch: UISwitch!
    4. @IBOutlet weak var halfStopSwitch: UISwitch!
    5. @IBOutlet weak var thirdStopSwitch: UISwitch!
    6. let userDelfaults = UserDefaults.standard
    7. var firstLaunchStopsSwitch: Bool {
    8. get {
    9. return userDelfaults.bool(forKey: "firstlaunchSwitch")
    10. }
    11. set {}
    12. }
    13. override func viewDidLoad() {
    14. super.viewDidLoad()
    15. if !firstLaunchStopsSwitch {
    16. userDelfaults.set(true, forKey: "firstlaunchSwitch")
    17. userDelfaults.set(true, forKey: "switchStateOne")
    18. }
    19. oneStopSwitch.isOn = userDelfaults.bool(forKey: "switchStateOne")
    20. halfStopSwitch.isOn = userDelfaults.bool(forKey: "switchStateHalf")
    21. thirdStopSwitch.isOn = userDelfaults.bool(forKey: "switchStateThird")
    22. }
    23. override func viewDidAppear(_ animated: Bool) {
    24. oneStopSwitch.isOn = userDelfaults.bool(forKey: "switchStateOne")
    25. }
    26. @IBAction func unwindStops(_ sender: UIStoryboardSegue) {
    27. dismiss(animated: true, completion: nil)
    28. }
    29. @IBAction func oneStopSwitchChanged(_ sender: UISwitch) {
    30. if sender.isOn == true {
    31. halfStopSwitch.isOn = false
    32. thirdStopSwitch.isOn = false
    33. } else if oneStopSwitch.isOn == false && halfStopSwitch.isOn == false && thirdStopSwitch.isOn == false {
    34. oneStopSwitch.isOn = true
    35. }
    36. saveswitches()
    37. }
    38. @IBAction func halfStopSwitchChanged(_ sender: UISwitch) {
    39. if sender.isOn == true {
    40. oneStopSwitch.isOn = false
    41. thirdStopSwitch.isOn = false
    42. } else if oneStopSwitch.isOn == false && halfStopSwitch.isOn == false && thirdStopSwitch.isOn == false {
    43. halfStopSwitch.isOn = true
    44. }
    45. saveswitches()
    46. }
    47. @IBAction func thirdStopSwitchChanged(_ sender: UISwitch) {
    48. if sender.isOn == true {
    49. oneStopSwitch.isOn = false
    50. halfStopSwitch.isOn = false
    51. } else if oneStopSwitch.isOn == false && halfStopSwitch.isOn == false && thirdStopSwitch.isOn == false {
    52. thirdStopSwitch.isOn = true
    53. }
    54. saveswitches()
    55. }
    56. func saveswitches() {
    57. userDelfaults.set(oneStopSwitch.isOn, forKey: "switchStateOne")
    58. userDelfaults.set(halfStopSwitch.isOn, forKey: "switchStateHalf")
    59. userDelfaults.set(thirdStopSwitch.isOn, forKey: "switchStateThird")
    60. }
    61. }
    Alles anzeigen
    Kann man das so stehen lassen?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Wolfgang1973 ()

  • Ohne es im Detail zu lesen: Folge einfach der Empfehlung, Standards für UserDefaults zu registrieren und gut ist ... es ist sauber und einfach.

    Mattes

    Edit: Ausserdem überlege Dir mal, ob Du statt drei Funktionen nicht eine nutzen kannst, wenn Du geschickt mit dem übergebenen Parameter sender arbeitest. Für mich sieht es zumindest so aus.
    Diese Seite bleibt aus technischen Gründen unbedruckt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von MyMattes ()

  • oje, wieder eine Aufgabe... :D nur ein Switch für drei Aufgaben...

    Nein, ich glaube, ohne es wirklich zu wissen, mit einem Switch komme ich nicht aus.
    Die drei Switches sollen drei verschiedene cases aus einem enum in einem PickervView anzeigen.

    Das geht mit meinem Wissensstand bisher zumindest nicht, oder doch?
  • Nicht ein Switch, sondern eine Funktion, die von allen drei Switches aufgerufen wird: Diese prüft alle drei Switches gegen den sender und setzt bei Gleichtheit die beiden anderen auf false etc.

    Das ist aber nur eine mögliche Optimierung, wobei kürzerer Code nicht immer besser ist: Wichtig ist, was Du - auch noch in sechs Monaten - verstehst. Ich nutze da selber häufig längere, aber verständlichere Varianten.

    Aber die Defaults-Registrierung solltest Du grundsätzlich verwenden...

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.