swift datepicker localnotification

swift - Incendio de notificación rápida de datePicker



localnotification (2)

Quiero configurar como notificación local fireDate la fecha de mi datePicker. Encontré ese código de otra respuesta en SO :

@IBOutlet var myDatePicker: UIDatePicker! @IBOutlet var mySwitch: UISwitch! var localNotification = UILocalNotification() // You just need one var notificationsCounter = 0 // put your functions now func datePicker() { myDatePicker.datePickerMode = UIDatePickerMode.Time } func notificationsOptions() { localNotification.timeZone = NSTimeZone.localTimeZone() localNotification.repeatInterval = .CalendarUnitDay UIApplication.sharedApplication().scheduleLocalNotification(localNotification) localNotification.alertAction = "Open App" localNotification.alertBody = "Here is the seven o''clock notification" localNotification.soundName = UILocalNotificationDefaultSoundName localNotification.applicationIconBadgeNumber = UIApplication.sharedApplication().applicationIconBadgeNumber + 1 // you may add arbitrary key-value pairs to this dictionary. // However, the keys and values must be valid property-list types // if any are not, an exception is raised. // localNotification.userInfo = [NSObject : AnyObject]? } func toggleSwitch(){ if mySwitch.on{ localNotification.fireDate = myDatePicker.date } else { localNotification.fireDate = NSDate(timeIntervalSinceNow: 999999999999) // will never be fired } } override func viewDidLoad() { super.viewDidLoad() datePicker() notificationsOptions() // Do any additional setup after loading the view, typically from a nib. }

Pero no funciona, incluso si todo parece correcto ... ¿dónde está el problema?


Parece que la propiedad fireDate solo se establece dentro del método toggleSwitch() . ¿Cómo se está llegando a ese método? Sugeriría que muevas el contenido de ese método directamente a tu método de notificationsOptions() .

Como datePicker() , es posible que desee considerar nombres ligeramente más útiles para sus métodos: datePicker() y notificationOptions() pueden causar dolores de cabeza de mantenimiento más adelante porque no son muy descriptivos.


Pruebe de esta manera:

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() } }

necesitarás esas extensiones:

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 )! } }