Swift 来自日期选择器的快速通知火灾

Swift 来自日期选择器的快速通知火灾,swift,datepicker,localnotification,Swift,Datepicker,Localnotification,我希望将日期选择器的日期设置为本地通知fireDate。我从以下位置找到该代码: 但是它不起作用,即使一切看起来都是正确的…问题出在哪里???看起来fireDate属性只是在toggleSwitch()方法中设置的。这种方法是如何实现的?我建议您将该方法的内容直接移动到notificationsOptions()方法中 作为一个旁白,您可能想为您的方法考虑一些更有用的名称:数据包()/和 NoTeCopeOpToStices()/>代码>稍后可能会导致您的维护头痛,因为它们不是非常有描述性的。

我希望将日期选择器的日期设置为本地通知fireDate。我从以下位置找到该代码:


但是它不起作用,即使一切看起来都是正确的…问题出在哪里???

看起来
fireDate
属性只是在
toggleSwitch()
方法中设置的。这种方法是如何实现的?我建议您将该方法的内容直接移动到
notificationsOptions()
方法中

作为一个旁白,您可能想为您的方法考虑一些更有用的名称:<代码>数据包()/<代码>和<代码> NoTeCopeOpToStices()/>代码>稍后可能会导致您的维护头痛,因为它们不是非常有描述性的。

尝试如下:

class ViewController: UIViewController {

    @IBOutlet var datePicker: UIDatePicker!
    @IBOutlet var notificationSwitch: UISwitch!

    let localNotification = UILocalNotification()

    override func viewDidLoad() {
        super.viewDidLoad()
        setUpNotificationsOptions()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()

    }

    func setUpNotificationsOptions()  {
        datePicker.datePickerMode = .Time
        localNotification.timeZone = NSTimeZone.localTimeZone()
        localNotification.repeatInterval = .Day
        localNotification.alertAction = "Open App"
        localNotification.alertBody = "a notification"
        localNotification.soundName = UILocalNotificationDefaultSoundName
    }

    func toggleNotification() {
        if notificationSwitch.on {
            localNotification.fireDate = datePicker.date.fireDate
            UIApplication.sharedApplication().scheduleLocalNotification(localNotification)
        } else {
            localNotification.fireDate = nil
            UIApplication.sharedApplication().cancelLocalNotification(localNotification)
        }
    }
    @IBAction func toggleSwitch(sender: UISwitch) {
       toggleNotification()
    }
    @IBAction func dateChanged(sender: UIDatePicker) {
       toggleNotification()
    }
}
您将需要这些扩展:

extension NSDate {
    var minute: Int {
        return NSCalendar.currentCalendar().component(.Minute, fromDate: self)
    }
    var hour: Int {
        return NSCalendar.currentCalendar().component(.Hour, fromDate: self)
    }
    var day: Int {
        return NSCalendar.currentCalendar().component(.Day, fromDate: self)
    }
    var month: Int {
        return NSCalendar.currentCalendar().component(.Month, fromDate: self)
    }
    var year: Int {
        return NSCalendar.currentCalendar().component(.Year, fromDate: self)
    }
    var fireDate: NSDate {
        let today = NSDate()
        return NSCalendar.currentCalendar().dateWithEra(1,
            year: today.year,
            month: today.month,
            day: { hour > today.hour || (hour  == today.hour
               &&  minute > today.minute) ? today.day : today.day+1 }(),
            hour: hour,
            minute: minute,
            second: 0,
            nanosecond: 0
            )!
    }
}

谢谢你,伙计!!!“它只是工作”!!!!!!你太棒了,你救了我的命,我欠你的债!现在我有一个问题:所有的代码都被放入一个“设置”控制器中……但我需要localNotification.alertBody值是主viewController中数组的内容。如果我传递这个值,我会得到那个错误:使用未解析的标识符…我如何才能传递这个限制?可以在设置控制器中声明一个新的indexPath?@Swift1请随意打开另一个问题,并在那里发布相关代码和解释,如果您想让我看一下,可以在这里发布链接。好的,我在这里打开了一个新问题:请帮助我!谢谢您知道如何将datePicker值存储到NSuserdefaults吗?
extension NSDate {
    var minute: Int {
        return NSCalendar.currentCalendar().component(.Minute, fromDate: self)
    }
    var hour: Int {
        return NSCalendar.currentCalendar().component(.Hour, fromDate: self)
    }
    var day: Int {
        return NSCalendar.currentCalendar().component(.Day, fromDate: self)
    }
    var month: Int {
        return NSCalendar.currentCalendar().component(.Month, fromDate: self)
    }
    var year: Int {
        return NSCalendar.currentCalendar().component(.Year, fromDate: self)
    }
    var fireDate: NSDate {
        let today = NSDate()
        return NSCalendar.currentCalendar().dateWithEra(1,
            year: today.year,
            month: today.month,
            day: { hour > today.hour || (hour  == today.hour
               &&  minute > today.minute) ? today.day : today.day+1 }(),
            hour: hour,
            minute: minute,
            second: 0,
            nanosecond: 0
            )!
    }
}