swift - 填充 CirleProgressView 并将结果保存到 UserDefaults

标签 swift xcode nsuserdefaults userdefaults

我的大学小项目需要帮助。我有两个 View Controller 。 首先 - DietViewController 第二 - WaterBalanceViewController(使用 SPStorkController)

我需要在我的 DietVC 中填充 CircleProgressView。 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

接下来,当我在第二个 VC 中单击按钮 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 的结果。

然后我想在我的第一个 VC 中使用我的 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 中显示所有内容。也许您可以编写一段代码,每 24 小时将 currentAmountOfWater 重置为零。

谢谢!

最佳答案

由于您正在立即从存储中检索值,因此您必须执行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),用户可能会输入非数字字符串,这可能会导致您的应用程序崩溃。

我更愿意调用委托(delegate)方法来更新 View Controller ,我已在 another post 中对此进行了简要说明。 , 你也可以看看 sample project

关于swift - 填充 CirleProgressView 并将结果保存到 UserDefaults,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56317487/

相关文章:

ios - 在 Swift 中从 HealthKit 读取血型、年龄、性别等

xcode - IOS MasterDetail Universal Project 如何添加登录?

ios - 在 NSuserdefaults 中保存选定的 list 行

ios - 从 NSUserDefaults 读取图像

ios - 具有通用(可选)用户默认值的属性包装器

ios - 设置 iOS 导航背景颜色无法正常工作

ios - 来自 URL 的图像不遵循 Storyboard 中的样式规则

swift - 在 swift 中将映射应用到 JSON 数组

c++ - 使用字符串读取文件 - Xcode

xcode - 找不到架构 i386 的 libcrypto.a 符号