Добавление введенного значения к существующему значению в swift - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть текстовое поле, в котором я могу ввести двойное число, и оно будет отображаться на ярлыке во втором контроллере вида.Это значение будет сохранено с использованием UserDefaults.Я изо всех сил пытаюсь найти, что делать, чтобы иметь возможность затем использовать это сохраненное значение и увеличить его с новым значением, введенным в текстовое поле.т.е. в первый раз я ввожу 5;на этикетке отображается 5. 2-й раз я ввожу 3;на этикетке отображается 8.

Я пытался использовать приведенную ниже функцию if, но это не сработало.Когда я вводю значение во второй раз, значение метки возвращается к 0, если затем снова введите значение, метка обновляется с введенным значением.

func saveOne() {
    UserDefaults.standard.set(weekOneTotal, forKey: "WEEKONE")
    secondScreen.weekOneText = String(UserDefaults().double(forKey: "WEEKONE"))
}

func addCorrectSpend () {
    guard let addAmount = convertAmount(input: enterField.text!) else {
        print("Invalid amount")
        return
    }

    if UserDefaults().double(forKey: "WEEKONE") == 0 {    
        weekOneTotal += addAmount  
        secondScreen.weekOneText = String(UserDefaults().double(forKey: "WEEKONE"))    
        saveOne()
    }

    else if UserDefaults().double(forKey: "WEEKONE") > 0 {
        let defaultOne = UserDefaults.standard
        defaultOne.set(defaultOne.double(forKey: "WEEKONE")+addAmount, forKey: "WEEKONE")
        secondScreen.weekOneText = String(UserDefaults().double(forKey: "WEEKONE"))
        saveOne()
    }
}

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Другой подход заключается в использовании пользовательского метода получения и установки для weekOneAmount, чтобы вы могли абстрагироваться от большинства ваших вызовов и работать с ним как с обычной переменной.

var weekOneAmount: Double {
        get {
            return UserDefaults.standard.double(forKey: "WEEKONE")
        }
        set {
            UserDefaults.standard.set(newValue, forKey: "WEEKONE")
        }
    }

Теперь, когда бы нивам нужно читать или писать, он ведет себя так же, как и любая другая переменная.

0 голосов
/ 01 февраля 2019

Чтобы ответить (быстро), почему это происходит: вы устанавливаете начальное значение в UserDetails.standard, что правильно, но затем вы обновляете значение в новом объекте UserDefaults() каждый раз.

Вы также можете немного сократить свой код, так как там есть некоторые ненужные вещи.В конечном итоге вам просто нужно добавить новое значение к существующему значению, так что вам не нужно проверять, действительно ли существующее значение == 0. Вот пример того, как я могу реорганизовать приведенный выше код:

func addCorrectSpend() {
  guard let addAmount = convertAmount(input: enterField.text!) else {
    print("Invalid amount")
    return
  }
  //Get the existing total (will be 0 if none)
  let weekOneAmount = UserDefaults.standard.double(forKey: "WEEKONE")
  //Add the existing total to the new amount from your textField
  let weekOneTotal = weekOneAmount + addAmount
  //Update UserDefaults.standard to the new value
  UserDefaults.standard.set(weekOneTotal, forKey: "WEEKONE")
  //Set the text
  secondScreen.weekOneText = "\(weekOneTotal)"
}
...