【问题标题】:Using NSUserDefaults to add a 24hour countdown timer in SWIFT使用 UserDefaults 在 SWIFT 中添加 24 小时倒计时计时器
【发布时间】:2016-10-26 16:19:30
【问题描述】:

我正在尝试添加一个计时器,当用户单击一个按钮时,它会启动一个 24 小时的计时器并在接下来的 24 小时内禁用该按钮。之后,它再次启用。对于在 SWIFT 中进行类似但不是 100% 有用的事情,有一些答案。

我遇到的主要问题是我希望这对每个用户都是特定的。因此,该用户的每次点击都是 24 小时。例如:如果我“喜欢”某件事,那么您希望能够在 24 小时内再次“喜欢”该特定事物,但仍然可以“喜欢”不同的事物?

谢谢

【问题讨论】:

    标签: ios iphone swift nsuserdefaults


    【解决方案1】:

    *

    适用于 Swift 3

    *

    我有一个每日视频广告,我的用户可以观看它以获得额外的现金。这是我用来确保他们每天只能查看一次的方法。

    1.) 创建一个在用户触发时将被调用的函数。

    func set24HrTimer() {
        let currentDate = NSDate()
        let newDate = NSDate(timeInterval: 86400, since: currentDate as Date)
    
        UserDefaults.standard.setValue(newDate, forKey: "waitingDate")
        print("24 hours started")
    
        //disable the button
    
    }
    

    2.) 在文件顶部创建一个变量。

    let todaysDate = NSDate()
    

    3.) 在viewDidLoaddidMoveToView 调用中:

    if let waitingDate:NSDate = UserDefaults.standard.value(forKey: "waitingDate") as? NSDate {
            if (todaysDate.compare(waitingDate as Date) == ComparisonResult.orderedDescending) {
                print("show button")
    
            }
            else {
                print("hide button")
    
            }
        }
    

    【讨论】:

    • let todaysDate = NSDate() 应该在if let waitingDate... 之后调用,而不是从“文件顶部”调用。因为如果你想在ViewDidAppear 中实现它作为检查,那么将它放在你的文件顶部,只会在视图的第一次加载时间保存,并且在你杀死应用程序之前它不会更新。跨度>
    【解决方案2】:

    您可以通过设置实际日期+ 1 day 并将其保存到您的NSUserDefaults: 中来做到这一点。

    因此,在您的按钮按下方法中,您可以执行以下操作:

    //user pressed button:
    func buttonPressed(){
        //current date
        let currentDate = NSDate()
        let calendar = NSCalendar.currentCalendar()
    
        //add 1 day to the date:
        let newDate = calendar.dateByAddingUnit(NSCalendarUnit.CalendarUnitDay, value: 1, toDate: currentDate, options: NSCalendarOptions.allZeros)
    
        NSUserDefaults.standardUserDefaults().setValue(newDate, forKey: "waitingDate")
    
        //disable the button
    }
    

    并检查您可以检索信息的时间。我建议在AppDelegatemethods 中检查它,例如applicationDidFinishLaunchingWithOptions

    //call it whereever you want to check if the time is over
    if let waitingDate:NSDate = NSUserDefaults.standardUserDefaults().valueForKey("waitingDate") as? NSDate{
        let currentDate = NSDate()
        //If currentDate is after the set date
        if(currentDate.compare(waitingDate) == NSComparisonResult.OrderedDescending){
            //reenable button
        }
    }
    

    【讨论】:

      【解决方案3】:

      首先要考虑几件事情。

      这个按钮不能被颠覆有多重要?

      如果您依赖于设备的当前时间和日期,那么用户始终可以在设备设置中将其向前移动一天。

      您希望任何行为发生在您的应用程序之外吗?

      是否应该通知用户该按钮现已启用

      假设您不需要严格执行 24 小时期限,并且您不想通知用户(他们可以在他们返回您的应用时发现),那么您只需做几件事。

      按下按钮时获取timeStamp,启动一个24Hours的NSTimer,并将timeStamp保存到NSUserDefaults。

      //Assuming you have a method named enableButton on self 
      let timer = NSTimer.scheduledTimerWithTimeInterval(86400, target: self, selector: "enableButton", userInfo: nil, repeats: false)
      NSUserDefaults.standardUserDefaults().setObject(NSDate(), forKey: "timeStamp")
      

      现在,如果用户永远不会离开您的应用,那您就很好。在现实生活中他们会这样做,因此您需要根据时间戳来检查重新进入应用程序时是否需要禁用按钮,并为剩余的时间启动一个新的计时器。

      【讨论】:

        猜你喜欢
        • 2014-05-18
        • 1970-01-01
        • 2019-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多