2017-09-24 10 views
0

나는 스스로 시간을 벌고 많은 질문을 끝내는 데 얼마나 걸리는 지 알 수있는 앱이있다. 시간이 다른 VC로 전송되어 레이블에 표시됩니다. 나는 버튼을 눌러서 저장하고 있지만 새로운 변수 (시간)가있을 때 그것을 바꿉니다. 어떻게 값의 배열을 저장하고 레이블에 표시 할 수 있습니까? 영구적으로 데이터를 보유UserDefaults를 사용하여 서로 바꿔주는 가치

@IBAction func saveScore(_ sender: Any) { 
    scoreLabel.text = label.text 
    UserDefaults.standard.set(scoreLabel.text, forKey: "score") 
} 

코드 :

override func viewDidAppear(_ animated: Bool) { 
    if let x = UserDefaults.standard.object(forKey: "score") as? String { 
     scoreLabel.text = x 
    } 
} 

내 scoreLabel 내 모든 점수를 표시하고 라벨이 방금 도착 시간을 보여줍니다

버튼 값을 저장합니다.

답변

0

사용 시간의 배열을 저장할 UserDefaults에서 다음 확장명 :

extension UserDefaults { 
    var times: [String] { 
     get { 
      if let times = UserDefaults.standard.object(forKey: "times") as? [String] { 
       return times 
      } else { 
       return [] 
      } 
     } 
     set { 
      UserDefaults.standard.set(newValue, forKey: "times") 
     } 
    } 
} 

당신은 지속 된 값을 사용하여 작업을 조금 단순화 할 수 확장을 사용하여, UserDefaults을 확장 할 필요가 없습니다 그것은 코드 청소기을 기울이고 있으나, . 단지 배열에 새로운 점수를 추가,

let arrayOfTimes = UserDefaults.standard.times 
scoreLabel.text = "\(arrayOfTimes)" // or any other formatting you'd like 

대신 새로운 점수를 지속 시간을 설정 :

는 그런 다음 데이터를 표시 시점에서, 배열에 액세스하려면 다음 줄을 사용 예 :

스위프트 4에서
// This will not only add the scoreLabel.text to the array, but also persists it 
UserDefaults.standard.times.append(scoreLabel.text) 
+0

덕분에 밀란의 도움이 매우 감사합니다! 내가 게임을 끝내면 라벨이 예를 들어 23.5 초라고 말한 것 대신에 "라벨"을 표시하는 방법을 제외하고는 그 외의 다른 것은 괜찮습니다. –

+1

은 UserDefaults의 문제가 아닙니다. 아마도 가장 중요한 것은 레이블의 텍스트 (및 데이터를 UserDefaults에 저장할 때). 코드를 살펴보고 사용 가능한 즉시 데이터를 UserDefaults에 저장하려고 시도하고 레이블이 제시 될 때 가능한 한 빨리 UserDefaults에서 레이블을 새로 고칩니다. 결국 viewController 사이에 전달해야 할 필요가 없습니다. 마지막에 도달하면 값을 추가하고 label이있는 viewController에서는 UserDefaults의 데이터를 사용합니다. –

+0

감사합니다. 감사의 말을 알려 드리겠습니다. 모두를위한! –

0

,

으로는 사용자가 기본으로하는 배열을 저장 당신이 할 것 TS :

let defaults = UserDefaults.standard 

let retrievedArray = defaults.array(forKey: "Scores") as? [Int] ?? [] 

을 그리고 당신은 다음 라벨의 배열의 점수를 표시 할 수 있다면, 당신은 단지 것 :

let defaults = UserDefaults.standard 

let array = [25, 50] 

defaults.set(array, forKey: "Scores") 

그리고 는 사용자의 기본 설정에서 배열에 액세스 할 수 내가 제안

scoreLabel.text = String(describing: retrievedArray[0]) 

당신이 당신의 점수 체계에 대한 정수를 사용하는 경우 않습니다 당신은 점수를 Int으로 사용자 기본값에 저장합니다. 당신이 생각 Strings을 사용하여 선호하는 경우

대신 array(forKey:) 방법을 직접 사용자 기본값 'stringArray(forKey:) 방법을 사용할 수 있음을 유의하시기 바랍니다, 따라서,이 경우에, 당신은 당신의 배열을 던져 입력 할 필요가 없습니다 것입니다 :

let someStringArray = defaults.stringArray(forKey: "ArrayOfStrings") 

참고 : 귀하의 질문에 대답하기 위해, 난 당신이 지능 점수를 사용하고 있다고 생각하지만, 당신이 선호하는 중 부담없이 사용됩니다.

let defaults = UserDefaults.standard 

// Your new score: 

let newScore = 75 

// Get your current scores list from User Defaults: 

var currentArray = defaults.array(forKey: "Scores") as? [Int] ?? [] 

// Append your new score to the current array:    

let updatedArray = currentArray.append(newScore) 

// And save your updated array to User Defaults: 

defaults.set(updatedArray, forKey: "Scores") 

// In this example, your User Defaults now contains the updated array [25, 50, 75] 

을 그리고 그것을 : 당신이 점수 사용자의 기본 설정에 동일한 키에 새를 얻을 때마다 배열 을 저장하려면

, 당신은 다음과 같이 쉽게 할 수 :).

그에 대한 확장을 사용할 필요가 없다는 것을 유의하시기 바랍니다 ..

가 UPDATE : 당신이 당신의 viewDidAppear 방법 내부에 무언가를 추가 할 경우는 또한, super.viewDidAppear(animated)를 추가해야합니다. 당신은보기를 제시과 관련된 추가 작업을 수행하기 위해이 메소드를 오버라이드 (override) 할 수

: 같은 등, viewDidLoad에 대한

documentation 상태를 간다. 이 메서드를 재정의하는 경우 구현시 어느 지점에서 super로 호출해야합니다.

그래서 당신은 할 것이다 :

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 

    if let retrievedArray = defaults.array(forKey: "Scores") as? [Int] { 

     print(retrievedArray) 

     // You can access your scores array safely here 
    } 
} 
+0

이 코드를 어디에 넣어야하는지 잘 모르겠습니다. 내 코드 점수 저장 버튼과 viewDidAppear의 userDefaults 코드에 대해 어떤 코드가 있어야합니까? 내가 어디로가는 것 같아 코드를 넣었지만 지금은 작동하지 않습니다. 그건 그렇고 문자열을 사용하고 있지만 정수를 사용해야합니다. 지금까지 감사드립니다! –

+0

점수가 앱의 정수를 나타내는 경우 실제로 Int로 저장하는 것이 더 바람직합니다. 물론 String (설명 :)을 사용하여 내 대답에 나와있는 것처럼 레이블에 점수를 표시 할 수 있습니다. – Alex

+0

음, 점수 저장 버튼을 누를 때마다 새 점수를 사용자 기본값에 저장하기 때문에 @IBAction (점수 저장)에이 코드를 삽입해야합니다. :) – Alex