Заполните CirleProgressView и сохраните результат в UserDefaults - PullRequest
1 голос
/ 27 мая 2019

Мне нужна помощь с моим маленьким проектом для университета. У меня есть два ViewControllers. Первый - 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 - мой второй ВК secondVC

Далее, когда я нажимаю на кнопку Drink в моем втором ВК, я должен сэкономить: сколько я только выпил. Например, вызовите эту переменную justDrunk. В моем первом ВК у меня есть 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 в моем первом виртуальном канале.

In 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 часа.

Спасибо!

1 Ответ

1 голос
/ 27 мая 2019

Поскольку вы извлекаете значение из хранилища немедленно , вы должны выполнить 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), пользователь может ввести нечисловую строку, что может вызвать сбой в вашем приложении.

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

...