2017-01-15 12 views
0

Я бы хотел, чтобы метка foxmill хранила высокий балл, используя пользовательский по умолчанию. Очевидно, что если будет новый высокий балл, я бы хотел его заменить. Проблема в том, что totalTime (что отслеживает оценку) является двойным, а не int. Во всех учебниках используется int для высокоуровневого урока.необходимо создать userdefualt, который сохраняет двойной как высокий балл (swift3)

import UIKit 
class winViewController: UIViewController { 

@IBOutlet var score2: UILabel! 
@IBOutlet var winningLabel: UILabel! 


    @IBOutlet var foxMill: UILabel! 


    @IBOutlet var hhighscore: UILabel! 
    public var LebelText: String? 
    public var LebelText2: String? 
    public var LebelText3: String? 
    public var LebelText4: String? 



override func viewDidLoad() { 
    super.viewDidLoad() 
       timeCalculation() 
    loadState() 



      } 
    func saveScore(score: Double) { 

     // Instantiate user defaults 
     let userDefaults:UserDefaults = UserDefaults.standard 

     // Set your score 
     userDefaults.set(score, forKey: "highScore") 

     // Sync user defaults 
     userDefaults.synchronize() 

    } 

    func loadState() { 
     let userDefaults = UserDefaults.standard 
     let score = userDefaults.double(forKey: "highScore") 
     foxMill.text = "High Score: \(score)" 
    } 
      func timeCalculation(){ 

     guard let unwrapedText = self.LebelText2 else { 
      return 
     } 

     guard let unwrapedText2 = self.LebelText else { 
       return 
     } 
     guard let unwrapedText3 = self.LebelText3 else { 
      return 
     } 
     guard let unwrapedText4 = self.LebelText4 else { 
      return 
     } 

     if let myInt = Double(unwrapedText), let myInt2 = Double(unwrapedText2), let myInt3 = Double(unwrapedText3), let myInt4 = Double(unwrapedText4) 


     { 
      var totalTime = myInt + myInt2 + myInt3 + myInt4 
      self.winningLabel.text = "You won"+"\n"+"Reaction time :" + String(totalTime) + " Seconds" 
      saveScore(score: totalTime) 

       }}} 

ответ

0

Вы просто сохранить значение с соответствующим ключом, то при извлечении его, убедитесь, что сделать это в Double:

func saveScore(score: Double) { 

    // Instantiate user defaults 
    let userDefaults:UserDefaults = UserDefaults.standard 

    // Set your score 
    userDefaults.set(score, forKey: "highScore") 

    // Sync user defaults 
    userDefaults.synchronize() 

} 

Теперь при обновлении значений Score, когда вы говорите, ... (unwrappedText), чтобы убедиться, что вы сохраните значения по умолчанию пользователь

if let myInt = Double(unwrapedText), let myInt2 = Double(unwrapedText2), let myInt3 = Double(unwrapedText3), let myInt4 = Double(unwrapedText4) 

    // HERE you do whatever it was you originally did with the text, but also save a value 

    saveScore(score: myInt) 

{ 

Теперь следующий раз, когда вы загрузите приложение, чтобы загрузить счет:

func loadScore() { 
    // Instantiate User Defaults 
    let userDefaults = UserDefaults.standard 
    let score = userDefaults.double(forKey: "highScore") 
} 

Вы действительно не должны назвать свойство «Минт», когда вы хотите, чтобы это было Double и не Integer

Если вы хотите, чтобы ваш foxMill ярлык, чтобы отобразить этот высокий балл при загрузке, вы хотите делайте две вещи. Сначала убедитесь, что до того, как приложение закрывается в какой-то момент, вы сохраняете свое состояние, синхронизируя свой UserDefaults, изучите методы вроде applicationDidEnterBackground и applicationWillTerminate в своем AppDelegate - но это немного выходит за рамки вашего вопроса. На данный момент я предполагаю, что вы правильно сохранили свое состояние в последний раз, когда приложение закрылось, вызвав функцию saveScore(score:), указанную выше. Итак, теперь вы хотите получить оценку и обновить свой лейбл foxMill при загрузке. Вы бы сделать что-то вроде этого:

Вы могли бы сделать что-то вроде этого, путем внесения изменений в метод loadScore выше:

func loadScore() { 
    // Instantiate User Defaults 
    let userDefaults = UserDefaults.standard 
    let score = userDefaults.double(forKey: "highScore") 
    foxMill.text = "High Score: \(score)" 
} 

А потом в конце viewDidLoad:

override func viewDidLoad() { 
    super.viewDidLoad() 

    loadScore() 
} 

Или вы могли бы измените метод, чтобы вернуть строку, которую вы затем присвоили тексту вашего ярлыка:

func loadScore() -> String { 
    // Instantiate User Defaults 
    let userDefaults = UserDefaults.standard 
    let score = userDefaults.double(forKey: "highScore") 
    return "High Score: \(score)" 
} 

Тогда в viewDidLoad:

override func viewDidLoad() { 
    super.viewDidLoad() 

    foxMill.text = loadScore() 
} 
+0

Как бы я использовать мой лейбл foxmill с этим? –

+0

@joemax - Я не понимаю, о чем вы спрашиваете. Вы хотите сохранить высокий балл как 'Double', используя' User Defaults', что это связано с вашей 'UILabel'? – Pierce

+0

что бы я поставил в viewdidload? –