我不能按照预期让NSUserdefaults为我工作

时间:2014-11-26 19:21:38

标签: ios iphone swift

我正在开发允许用户每天投票一次的应用程序。要设置该时间限制,我声明voteStatus布尔变量。它的值取决于controlDate,它可以是" nil"如果第一次运行应用程序然后votingStatus是真的。

然而,该应用程序无法正常工作。仅在重置应用程序后,votingStatus变量才会更改其值。这显然不是我的预期。每次用户点击按钮时,我都需要检查并更新votingStatus变量。

提前感谢您分享您的想法如何纠正应用程序流程!

在我在ViewController类中编写的代码下面: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.
}

2 个答案:

答案 0 :(得分:0)

viewDidLoad()被调用一次,直到您的视图从内存中删除,因此如果系统将您的应用程序保留在内存中一周viewDidLoad()将不会被调用。您可以设置除viewDidLoad()之外的日期计时器,也可以像在yesButtonPressed func中的viewDidLoad()中一样检查controlDate值。

答案 1 :(得分:0)

我还没有测试过,只是一个快速回答:也许你的方法在一个Optional上调用“timeIntervalSinceNow”是问题所在。为什么不将该行放入if-block,在那里你可以确定有一个值并用它包装!而不是?

    var dayInSeconds = 24.0 * 3600

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

        **var timeInterval = controlDate!.timeIntervalSinceNow**

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