Ios Swift 4:使用日历检查首次发布后的周、月、2个月等是否已过

Ios Swift 4:使用日历检查首次发布后的周、月、2个月等是否已过,ios,swift,calendar,Ios,Swift,Calendar,我正在尝试加入计时器,以便在应用程序首次启动日期后的一周、一个月、两个月等时间出现一个按钮 我曾经使用过(见下面的代码),但它在较长的时间段(周/月)内似乎没有那么有效。Swift文档建议使用日历,但我不确定如何做到这一点 override func viewDidLoad() { super.viewDidLoad() if installedDate == nil { installedDate = Date()

我正在尝试加入计时器,以便在应用程序首次启动日期后的一周、一个月、两个月等时间出现一个按钮

我曾经使用过(见下面的代码),但它在较长的时间段(周/月)内似乎没有那么有效。Swift文档建议使用日历,但我不确定如何做到这一点

override func viewDidLoad() {
       super.viewDidLoad()

        if installedDate == nil {
            installedDate = Date()
            let timer = Calendar.current

            Button1.isHidden = true
            Button2.isHidden = true
            Button3.isHidden = true
        }

        else {
            print("Not first run")
            print(installedDate!)

            let Button1Date = Date().addingTimeInterval(604800)      //for after 1 week
            let Button2Date = Date().addingTimeInterval(2592000)     //for after 1 month
            let Button3Date = Date().addingTimeInterval(5184000)     //for after 2 months


            if installedDate == Button1Date {
                Button1.isHidden = false
            }
            if installedDate == Button2Date {
                Button2.isHidden = false
            }
            if installedDate == Button3Date {
                Button.isHidden = false
            }

        }

    }

    var installedDate: Date? {
        get {
            return UserDefaults.standard.object(forKey: "installedDateKey") as? Date
        }
        set {
            UserDefaults.standard.set(newValue, forKey: "installedDateKey")
        }
    }

将发布日期与我需要的预期日期进行比较的更有效的方法是什么?

根据我对您问题的理解,如果他们拥有应用程序超过一定时间,您希望显示一个按钮。如果是这样,我已经编写了一些代码,这些代码将对您有所帮助:

let timeSinceInstalled = -(installedDate ?? Date()).timeIntervalSinceNow

Button1.isHidden = timeSinceInstalled < 604800
Button2.isHidden = timeSinceInstalled < 2592000
Button3.isHidden = timeSinceInstalled < 5184000
如果您想在按钮不可单击时将标题设置为“you have none available”(您没有可用的标题),请参见以下代码:

override func viewDidLoad() {
    super.viewDidLoad()
    let timeSinceInstalled = -(installedDate ?? Date()).timeIntervalSinceNow
    setTitle(Button1, timeSinceInstalled < 604800)
    setTitle(Button2, timeSinceInstalled < 2592000)
    setTitle(Button3, timeSinceInstalled < 5184000)
}

func setTitle(_ button: UIButton, _ statement: Bool) {
    button.setTitle(statement ? "You have none available" : "Click me", for: .normal)
    button.isEnabled = !statement
}

var installedDate: Date? {
    get {
        return UserDefaults.standard.object(forKey: "installedDateKey") as? Date
    }
    set {
        UserDefaults.standard.set(newValue, forKey: "installedDateKey")
    }
}
override func viewDidLoad(){
super.viewDidLoad()
让timeSinceInstalled=-(installedDate??Date()).timeIntervalSinceNow
设置标题(按钮1,安装时间<604800)
设置标题(按钮2,安装时间<2592000)
设置标题(按钮3,安装时间<5184000)
}
func setTitle(u按钮:UIButton,u语句:Bool){
button.setTitle(语句?“您没有可用的”:“单击我”,用于:。正常)
button.isEnabled=!语句
}
var安装日期:日期?{
得到{
将UserDefaults.standard.object(forKey:“installedDateKey”)返回为?日期
}
设置{
UserDefaults.standard.set(newValue,forKey:“installedDateKey”)
}
}

根据我对您问题的理解,如果他们使用该应用超过一定时间,您希望显示一个按钮。如果是这样,我已经编写了一些代码,这些代码将对您有所帮助:

let timeSinceInstalled = -(installedDate ?? Date()).timeIntervalSinceNow

Button1.isHidden = timeSinceInstalled < 604800
Button2.isHidden = timeSinceInstalled < 2592000
Button3.isHidden = timeSinceInstalled < 5184000
如果您想在按钮不可单击时将标题设置为“you have none available”(您没有可用的标题),请参见以下代码:

override func viewDidLoad() {
    super.viewDidLoad()
    let timeSinceInstalled = -(installedDate ?? Date()).timeIntervalSinceNow
    setTitle(Button1, timeSinceInstalled < 604800)
    setTitle(Button2, timeSinceInstalled < 2592000)
    setTitle(Button3, timeSinceInstalled < 5184000)
}

func setTitle(_ button: UIButton, _ statement: Bool) {
    button.setTitle(statement ? "You have none available" : "Click me", for: .normal)
    button.isEnabled = !statement
}

var installedDate: Date? {
    get {
        return UserDefaults.standard.object(forKey: "installedDateKey") as? Date
    }
    set {
        UserDefaults.standard.set(newValue, forKey: "installedDateKey")
    }
}
override func viewDidLoad(){
super.viewDidLoad()
让timeSinceInstalled=-(installedDate??Date()).timeIntervalSinceNow
设置标题(按钮1,安装时间<604800)
设置标题(按钮2,安装时间<2592000)
设置标题(按钮3,安装时间<5184000)
}
func setTitle(u按钮:UIButton,u语句:Bool){
button.setTitle(语句?“您没有可用的”:“单击我”,用于:。正常)
button.isEnabled=!语句
}
var安装日期:日期?{
得到{
将UserDefaults.standard.object(forKey:“installedDateKey”)返回为?日期
}
设置{
UserDefaults.standard.set(newValue,forKey:“installedDateKey”)
}
}

无论用户是否将应用程序放在前台,这都是您希望在一个月过去后的第二个月发生的操作,还是您希望在一个月过去后用户第一次打开应用程序时发生的操作?正如@bsod所提到的,您的问题是以毫秒为单位比较日期。如果要这样做,您需要将它们添加到
installedDate
,而不是
Date()
,否则这几乎不起作用。@bsod是的,这是我希望在一个月后完全执行的操作。每次他们打开应用程序时,它都会检查安装日期是否已过一个月。我的下一步是加入一个通知,让他们知道他们有一个新按钮要查看,我也不知道该怎么做。@WheeeCode检查我的答案,我想我解决了你的问题。@WheeeCode,如果你没有注意到,我更新了我的答案以解决您的问题。这是您希望在一个月后的第二天发生的操作,无论用户是否将应用程序放在前台,还是您希望在一个月后用户第一次打开应用程序时发生的操作?正如@bsod所述,您的问题是,您正在以毫秒为单位比较日期。如果要这样做,您需要将它们添加到
installedDate
,而不是
Date()
,否则这几乎不起作用。@bsod是的,这是我希望在一个月后完全执行的操作。每次他们打开应用程序时,它都会检查安装日期是否已过一个月。我的下一步是加入一个通知,让他们知道他们有一个新按钮要查看,我也不知道该怎么做。@WheeeCode检查我的答案,我想我已经解决了你的问题。@WheeeCode,如果你没有注意到,我更新了我的答案来解决你的问题。如果我想让屏幕上出现这些按钮在第一个计时器通过之前,“您没有可用的”,我将如何添加它?如果我想在屏幕上显示这些按钮,在第一个计时器通过之前显示“您没有可用的”,我将如何添加它?