2014-11-26 4 views
0

사용자가 하루에 한 번 투표 할 수있는 응용 프로그램을 개발 중입니다. 이 시간 제한을 설정하기 위해 votingStatus Boolean 변수를 선언합니다. 이 값은 controlDate에 따라 다릅니다.이 값은 앱을 처음 실행하고 votingStatus가 true 인 경우 'nil'이 될 수 있습니다.NSUserdefaults가 예상대로 작동하지 않습니다.

그러나 응용 프로그램이 제대로 작동하지 않습니다. votingStatus 변수는 응용 프로그램을 재설정 한 후에 만 ​​값을 변경합니다. 분명히 내가 기대했던 것이 아닙니다. 사용자가 버튼을 클릭 할 때마다 votingStatus 변수를 확인하고 업데이트해야합니다.

미리 공유 해 주셔서 감사합니다. 애플리케이션 흐름을 수정하는 방법에 대해 미리 감사드립니다. 내가 클래스의 ViewController 내부에서 작성한 코드 아래

:보기가 메모리에서 제거 될 때까지 시스템이 주에있는 viewDidLoad 메모리에 응용 프로그램을 유지, 그래서 만약의 UIViewController {}

var votingStatus: Bool? 

@IBAction func yesButtonPressed(sender: AnyObject) { 

    //Check if votingStatus is true 
    if votingStatus == true { 
     //I'm using Parse for backend 
     var score = PFObject(className: "score") 
     score.setObject(1, forKey: "vote") 
     score.saveInBackgroundWithBlock{ 
      (succes: Bool!, error: NSError!) -> Void in 
      if succes == true { 
       println("Done with ID \(score.objectId)") 
       //update NSUserdefaults 
       NSUserDefaults.standardUserDefaults().setObject(NSDate(), forKey: "controlDate") 
       // should I NSUserDefaults.standardUserDefaults().synchronize() below? 
      } else { 
       println(error) 
       //show alert 
      } 
     } 
    } else { 
     println("Status is \(votingStatus)") 
    } 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Find if user haven't already voted within 1 day so if his/her voting status true 
    // var votingStatus: Bool? 

    //To retrive the control date value. First time it has nil value 
    var controlDate = NSUserDefaults.standardUserDefaults().objectForKey("controlDate") as? NSDate 
    var timeInterval = controlDate?.timeIntervalSinceNow 
    var dayInSeconds = 24.0 * 3600 

    if controlDate == nil { 
     votingStatus = true 
    } else { 
     if timeInterval < dayInSeconds { 
      votingStatus = false 
     } else { 
      votingStatus = true 
     } 
    } 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 
+0

(즉, 질문의 경우) 예 ... 당신이 (제대로 있지만 작동하지 않습니다 – Jack

+0

'동기화를()'호출해야합니다 ( –

+0

값'tomeIntervalSinceNow'이 날짜에 대한 반환 일에 대해 생각을 가지고 지난 1 분 전에 몇 초가 걸렸습니까? 즉, 1 분 전에 시간을 얻으려면 "지금"에 추가 할 숫자를 입력하고 비교를 보겠습니다. 또한 'viewDidLoad'는 아마도 이 코드에 가장 적합한 장소 - 한 번만 실행됩니다.이보기가 표시되는 동안 "일"이 만료되면 어떻게합니까? – Paulw11

답변

0

있는 viewDidLoad는()() 번이라고합니다 전화하지 않습니다. viewDidLoad() 외에도 day 타이머를 설정하거나 yesButtonPressed func의 viewDidLoad()에서와 같이 controlDate 값을 확인할 수 있습니다.

+0

이것은 문제이지만 주된 문제는 아닙니다. 가장 큰 문제점은 과거와 마찬가지로 시간 간격이 음수가되어 <비교가 잘못된 것입니다. – Paulw11

+0

@ Андрій Жицький 답장을 보내 주셔서 감사합니다! 옳은! 그러나 "viewDidLoad()"외에도 하루 타이머를 설정한다는 것은 무엇을 의미합니까? 추신 신의 축복이 우크라이나! –

+0

@ Paulw11 dayInSeconds에 마이너스를 더하여 수정했습니다. –

0

나는 테스트하지 않았다. 단지 빠른 대답이다 : 옵션 호출시 "timeIntervalSinceNow"라는 메서드 호출이 문제 일 수있다. 그 라인을 if 블록에 넣지 마십시오. 여기서 값이 있다는 것을 확신 할 수 있습니다. 대신에 ?

var dayInSeconds = 24.0 * 3600 

    if controlDate == nil { 
     votingStatus = true 
    } else { 

     **var timeInterval = controlDate!.timeIntervalSinceNow** 

     if timeInterval < dayInSeconds { 
      votingStatus = false 
     } else { 
      votingStatus = true 
     } 
    } 
} 
관련 문제