Заполните CirleProgressView и сохраните результат в UserDefaults

Мне нужна помощь с моим маленьким проектом для университета. У меня два ViewController. Первый - DietViewController Второй - WaterBalanceViewController (используйте SPStorkController)

Мне нужно заполнить CircleProgressView в моем DietVC. DietVC

Когда я нажимаю Drink ->

 @IBAction func drinkAction(_ sender: UIButton) {

        let controller = WaterBalanceViewController()
        let transitionDelegate = SPStorkTransitioningDelegate()
        controller.transitioningDelegate = transitionDelegate
        controller.modalPresentationStyle = .custom
        transitionDelegate.customHeight = 620
        transitionDelegate.showIndicator = false
        self.present(controller, animated: true, completion: nil)
    }

И откройте SPStorkController - мой второйVC  secondVC

Затем, когда я нажимаю кнопку Drink в моем втором ВК, я должен сохранить: сколько я только что выпил. Например, назовите эту переменную justDrunk. В моем первом VC у меня есть var currentAmountOfWater = Float() Это значение, которое будет передано в CircleProgressView. Я пытаюсь сэкономить:

@objc func pressButton(_ sender: UIButton){
        print("Hello")

        self.justDrunk = Float(textField.text!)!
        let vc = DietViewController()
        vc.currentAmountOfWater += justDrunk
        vc.currentAmountOfWater += justDrunk
       UserDefaults.standard.set(vc.currentAmountOfWater, forKey: "currentAmountOfWater")

        print(UserDefaults.standard.float(forKey: "currentAmountOfWater"))



        self.dismiss(animated: true, completion: nil)


    }

Когда я пытаюсь распечатать, я вижу, что мое значение не сохраняется. Всегда печатал результат justDrunk.

Тогда я хочу использовать свой currentAmountOfWater в моем первом ВК.

В viewDidLoad `var valueForWater = currentAmountOfWater / maxAmountOfWater

waterProgress.progressColor = UIColor(red: 0, green: 122/255, blue: 1, alpha: 1)
       waterProgress.setProgressWithAnimation(duration: 1, value: valueForWater)

Пожалуйста, помогите мне. Как ввести данные в secondVC, передать данные в firsVC и отобразить все в CicrleProgressView. И, возможно, вы сможете написать код, который будет сбрасывать currentAmountOfWater на ноль каждые 24 часа.

Спасибо!


person Stormios    schedule 26.05.2019    source источник


Ответы (1)


Поскольку вы получаете значение из хранилища немедленно, вы должны выполнить UserDefaults.standard.synchronize(), чтобы ваши изменения были записаны на диск немедленно.

Вот ваш обновленный метод

@objc func pressButton(_ sender: UIButton){
    guard let justDrunk = Float(textField.text!) else { return }

    self.justDrunk = justDrunk

    let vc = DietViewController()
    vc.currentAmountOfWater += justDrunk
    vc.currentAmountOfWater += justDrunk
    UserDefaults.standard.set(vc.currentAmountOfWater, forKey: "currentAmountOfWater")
    UserDefaults.standard.synchronize()

    print(UserDefaults.standard.float(forKey: "currentAmountOfWater"))

    self.dismiss(animated: true, completion: nil)
}

Небольшое примечание: не разворачивайте принудительно Float(String), пользователь может ввести нечисловую строку, что может вызвать сбой в вашем приложении.

Я бы предпочел вызвать метод делегата для обновления контроллера представления, который я кратко объяснил в другом сообщении, вы также можете иметь взгляните на образец проекта

person AamirR    schedule 26.05.2019