2016-06-23 4 views
1

Viewcontroller:Objective-C: UILocalNotification

- (void)viewDidLoad 
{ 
`[super viewDidLoad];` 

dateFormatter.dateFormat = @"dd/MM"; 
timeFormatter.dateFormat = @"HH:mm"; 
NSString *dateString = [dateFormatter stringFromDate:dateTime]; 
NSString *timeString = [timeFormatter stringFromDate:dateTime]; 

if ([dateString isEqual:@"23/06"]) { 
    if ([timeString isEqual:@"23:30"]) { 
     UILocalNotification *localNotification = [[UILocalNotification alloc] init]; 
     localNotification.fireDate = dateTime; 
     localNotification.alertBody = [NSString stringWithFormat:@"It's 11:30 PM 23th June!"]; 
     localNotification.soundName = UILocalNotificationDefaultSoundName; 
     localNotification.applicationIconBadgeNumber = 1; 
     [[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; 
    } 
} 
} 

AppDelegate:

[[UIApplication sharedApplication] scheduledLocalNotifications]; 

if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)]){ 

    [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge| UIUserNotificationTypeSound categories:nil]]; 
} 

Die Meldung wird nicht mit, wenn die Zeit-String und das Datum entspricht. Bitte helfen!

+0

Wie wird 'dateTime' eingestellt? –

+0

NSDate * DatumZeit; NSDateFormatter * DatumFormatter; NSDateFormatter * timeFormatter; \ n Nach der Implementierung –

+0

Hmmm, also wird 'dateTime' nie gesetzt? Oder setzen Sie es auf das aktuelle Datum mit 'dateTime = [NSDate date];'? Wenn Sie es nicht eingestellt haben, dann wäre das das Problem. Wenn Sie haben, dann der Grund, warum ich frage, wie es gesetzt wird, ist, weil Sie es in eine Zeichenfolge zum Vergleichen konvertieren, die ein Problem mit Gebietsschema sein könnte. –

Antwort

1

Das Kernproblem dabei (abgesehen von Strings zum Vergleichen von Daten) ist, dass viewDidLoad nur einmal in dieser Anwendung aufgerufen wird. Da Sie die lokale Benachrichtigung nur planen, wenn das aktuelle Datum 11:30 ist, wird sie nie aufgerufen, da Sie das fireDate auch auf die gleiche genaue Zeit setzen.

Die Sache ist, lokale Benachrichtigungen werden vor dem Ereignis geplant. In der Tat sollten Sie dateTime auf die gewünschte Zeit einstellen und dann die lokale Benachrichtigung einstellen.

Zum Beispiel:

- (void)viewDidLoad { 

[super viewDidLoad]; 

NSDateComponents *dateComponents = [[NSDateComponents alloc] init]; 
[dateComponents setYear:2016]; 
[dateComponents setMonth:6]; 
[dateComponents setDay:23]; 
[dateComponents setHour:23]; 
[dateComponents setMinute:30]; 

dateTime = [[NSCalendar currentCalendar] dateFromComponents:dateComponents]; 

UILocalNotification *localNotification = [[UILocalNotification alloc] init]; 
localNotification.fireDate = dateTime; 
localNotification.alertBody = [NSString stringWithFormat:@"It's 11:30 PM 23th June!"]; 
localNotification.soundName = UILocalNotificationDefaultSoundName; 
localNotification.applicationIconBadgeNumber = 1; 
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; 
} 

Basierend auf Ihrem hochgeladenen Code, es sieht aus wie Sie aus dem Datepicker packen das Datum zu gehen, so schließlich, werden Sie den UILocalNotification Teil auf die Schaltfläche Methode bewegen und Verwendung [datePicker date] als fireDate. Das heißt, Sie können den dateComponents Teil ignorieren.

+0

Ich bin so dankbar, dass du deine Zeit verschwendest! Vielen Dank! aber noch eine Sache ... Wie setze ich das Jahr für jedes Jahr ein, ich meine diese Wiederholung jedes Jahr um 23/Juni/Zeit: 23:30? (nicht nur 2016) –

+1

Oh, es ist kein Problem! Lokale Benachrichtigungen haben eine Eigenschaft 'repeatInterval', die Sie auf eine Kalendereinheit setzen können (eine davon ist Jahr). –