【问题标题】:Increase, save and update score into UILabel增加、保存和更新分数到 UILabel
【发布时间】:2017-10-10 17:49:56
【问题描述】:

我正在创建 Puzzle Word 游戏,即使用户退出应用程序,我如何增加、保存和更新分数?但我想在 UILabel 上添加点并在完成动画后增加

代码:

class QuestionView: UIViewController {

    var score = 0

    func animate(sender: UIButton) {

        UIView.animate(withDuration: 2, delay: 0, usingSpringWithDamping: 0.2, initialSpringVelocity: 6, options: .allowUserInteraction, animations: { [weak self] in

            sender.transform = .identity

        }) { (finished) in

            score += 2 // Must be increase by 2

        }

    }

    func createCoins() {

        let lblCoins = UILabel()
        lblCoins.text = "\(score)"
        self.view.addSubview(lblCoins)

    }

}

【问题讨论】:

    标签: swift animation uilabel


    【解决方案1】:

    更新 score 变量后,您还必须更新 lblCoins.text。 要将数据保存在磁盘上,您可以写入设备文档目录中的文件。 保存每次分数变化的数据。

    这应该可以帮助您: http://www.seemuapps.com/read-to-and-write-from-a-text-file-in-swift

    应用启动后从文件读取并设置分数变量。 例如,您可以在 viewDidLoad 中执行此操作。

    【讨论】:

      【解决方案2】:

      我认为您是在询问如何跟踪值(分数),以便在用户再次打开应用程序时检索它。如果是这种情况,那么您可以使用UserDefaults database

      UserDefaults 非常适合存储少量数据,例如分数或用户偏好。

      下面示例中显示的synchronize 方法调用是可选的:iOS 会不时自动进行该调用。如图所示,您可以手动调用它,以确保您的分数在适当的时间更新。

      Swift 3.x:

      // define a constant String name for the key where the score will be stored
      // (note: this can be any name you want; I randomly chose "scoreKey")
      let scoreKey = "scoreKey"
      
      // even if the key's value isn't Bool, iOS will return 'false'
      // if the key hasn't been set or 'true' if it has been set
      let scoreKeyExists: Bool = NSUserDefaults.standardUserDefaults().boolForKey(scoreKey)
      
      // if no value has been set, yet, then set an initial value 
      if !scoreKeyExists {
          NSUserDefaults.standardUserDefaults().setInt(0, forKey: scoreKey)
          NSUserDefaults.standardUserDefaults().synchronize()
      }
      
      // retrieve the value when needed
      let currentScore = NSUserDefaults.standardUserDefaults().intForKey(scoreKey)
      
      // set value as needed
      let newScore = 10
      NSUserDefaults.standardUserDefaults().setInt(newScore, forKey: scoreKey)
      NSUserDefaults.standardUserDefaults().synchronize()
      

      斯威夫特 4:

      // define a constant String name for the key where the score will be stored
      // (note: this can be any name you want; I randomly chose "scoreKey")
      let scoreKey = "scoreKey"
      
      // even if the key's value isn't Bool, iOS will return 'false'
      // if the key hasn't been set
      let scoreKeyExists: Bool = UserDefaults.standard.bool(forKey: scoreKey)
      
      // if no value has been set, yet, then set an initial value 
      if !scoreKeyExists {
          UserDefaults.standard.set(0, forKey: scoreKey)
          UserDefaults.standard.synchronize()
      }
      
      // retrieve the value when needed
      let currentScore = UserDefaults.standard.int(forKey: scoreKey)
      
      // set value as needed
      let newScore = 10
      UserDefaults.standard.set(newScore, forKey: scoreKey)
      UserDefaults.standard.synchronize()
      

      而且,为了在 finish 闭包期间更新您的标签,您需要将您的标签设置为一个全局变量,就像您的分数一样。

      您可以通过 Interface Builder 将其添加为 IBOutlet。查看本教程以获取有关如何Connect the UI to Code 的示例。

      【讨论】:

      • 请问scoreKey 是什么??
      • UserDefaults 是具有键值对的字典。为了存储和检索一个值,您需要发明一个String-type 键名。 scoreKey 是我为存储分数的密钥发明的名称。 (我忘记在我的答案中包含该定义,所以我现在将其更新。)
      • 请注意,为了清楚起见,我给出的示例不一定都在一起。例如,您将全局设置键名常量。然后,您可以在需要检索密钥值的任何地方使用它。你会在使用它之前检查密钥是否存在,或者当你的应用程序启动时,如果你要在第一次玩游戏时设置一个初始值,比如说。然后,在您需要的任何地方设置或检索该值,以使您的游戏正常运行。
      • 对不起,这段代码不起作用,也没有增加标签的分数!!你还有别的解决办法吗?? @leanne
      【解决方案3】:

      这是我的解决方案:

      func animate(sender: UIButton) {
      
          UIView.animate(withDuration: 2, delay: 0, usingSpringWithDamping: 0.2, initialSpringVelocity: 6, options: .allowUserInteraction, animations: { [weak self] in
      
              sender.transform = .identity
      
          }) { (finished) in
      
              score += 2
              lblScoreCoins.text = String(score)
              UserDefaults.standard.set(lblScoreCoins.text, forKey: "Key")
      
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-15
        • 2015-03-02
        • 1970-01-01
        • 2022-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多