2014-01-31 6 views
6

Ich muss UILocalNotification einstellen, ich muss nur Stunden und Minuten von DatePicker nehmen und muss ein bestimmtes Datum (wie: Montag) und wiederholen Sie es an jedem Montag.Wiederholen UILocalNotification am spezifischen Tag

Ich habe zwei Frage:

Zuerst ein; ist es möglich, nur "Tagnamen" wie "Sonntag" im Datumsbereich der Datumsauswahl anzuzeigen?

Zweite Frage ist; Was sind die richtigen Codes, wenn ich ein bestimmtes Datum für die lokale Benachrichtigung festlegen möchte?

Vielen Dank für die Antworten und hier ist mein Code unten;

-(IBAction) alarmButton:(id)sender { 

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; 
dateFormatter.timeZone = [NSTimeZone defaultTimeZone]; 
dateFormatter.timeStyle = NSDateFormatterShortStyle; 
dateFormatter.dateStyle = NSDateFormatterShortStyle; 

NSString *dateTimeString = [dateFormatter stringFromDate: dateTimePickerSet1.date]; 
NSLog (@"Alarm Set :%@" , dateTimeString); 

[self scheduleLocalNotificationWithDate1: dateTimePickerSet1.date]; 

} 

-(void)scheduleLocalNotificationWithDate1:(NSDate *)fireDate { 
UILocalNotification *notification = [[UILocalNotification alloc] init]; 

notification.fireDate = fireDate; 
notification.alertBody = @"Alarm Set !"; 

[[UIApplication sharedApplication] scheduleLocalNotification:notification]; 
+0

prüfen - http://useyourloaf.com/blog/2010/09/13/repeating-an-ios-local-notification.html oder Sie c ein auch erhalten Sie Hilfe von http://stackoverflow.com/questions/14769462/set-repeatinterval-in-local-notification oder http://stackoverflow.com/questions/18014438/repeating-a-local-notification-after- alle-14-Tage-zwei-Wochen – Bharat

Antwort

8

Frage 1 => Ich kann nicht verstehen, was Sie wollen. (Aber wenn Sie nur Namen von Tagen so wie Sonntag angezeigt werden soll, Montag, .... bis Samstag dann verwenden UIPickerView.)

Frage 2 =>JA Sie können richtig erhalten Datum bestimmten Tages und Sie können Benachrichtigung über jeden bestimmten Tag von Satz localNotification.repeatInterval = NSWeekCalendarUnit;

Für erreichen es erhalten, muß auch (Methode der) Code folgendes Stück verwenden. Diese Methode wird korrekte Datum der spezifischen ausgewählten Tag zurückkehren, müssen Sie nur Tag als Parameter der Methode zu übergeben so wie,

Wenn diese Option aktiviert Tag Sonntag ist dann
passieren Wenn diese Option aktiviert Tag Montag dann Pass
.
.
.
Wenn ausgewählten Tag dann Samstag ist 7 passieren

Hier Methodencode:

-(NSDate *) getDateOfSpecificDay:(NSInteger) day /// here day will be 1 or 2.. or 7 
{ 
    NSInteger desiredWeekday = day 
    NSRange weekDateRange = [[NSCalendar currentCalendar] maximumRangeOfUnit:NSWeekdayCalendarUnit]; 
    NSInteger daysInWeek = weekDateRange.length - weekDateRange.location + 1; 

    NSDateComponents *dateComponents = [[NSCalendar currentCalendar] components:NSWeekdayCalendarUnit fromDate:[NSDate date]]; 
    NSInteger currentWeekday = dateComponents.weekday; 
    NSInteger differenceDays = (desiredWeekday - currentWeekday + daysInWeek) % daysInWeek; 
    NSDateComponents *daysComponents = [[NSDateComponents alloc] init]; 
    daysComponents.day = differenceDays; 
    NSDate *resultDate = [[NSCalendar currentCalendar] dateByAddingComponents:daysComponents toDate:[NSDate date] options:0]; 
    return resultDate; 
} 

Und vergessen Sie nicht localNotification.repeatInterval = NSWeekCalendarUnit;

+0

Vielen Dank für Ihre Antwort, aber ich brauche etwas mehr Hilfe in Bezug auf Antwort Nr .: 2. Ist es möglich, einige Beispielcode über die Verwendung Ihrer Antwort mit der Datumsauswahl Config zu bekommen? Ich bin nicht ganz sicher, wo ich das umsetzen muss :(Vielen Dank noch einmal @iPatel – Rick

+1

Nach ein paar Stunden zu verstehen, Ihre Methode dann implementiere ich es und jetzt funktionierte es perfekt! Vielen Dank @iPatel. – Rick

0

Hier @ iPatel-Lösung zu setzen, die auch Faktoren in der Zeitkomponente über den Datepicker übergeben. (Ich habe auch seine Lösung aktualisiert, um die neuesten Kalendereinheiten zu verwenden, die nicht veraltet sind).

- (NSDate *) getFireDateForDayOfWeek:(NSInteger)desiredWeekday withTime:(NSDate *)time // 1:Sunday - 7:Saturday 
{ 
    NSRange weekDateRange = [[NSCalendar currentCalendar] maximumRangeOfUnit:NSCalendarUnitWeekday]; 
    NSInteger daysInWeek = weekDateRange.length - weekDateRange.location + 1; 

    NSDateComponents *dateComponents = [[NSCalendar currentCalendar] components:NSCalendarUnitWeekday fromDate:[NSDate date]]; 
    NSInteger currentWeekday = dateComponents.weekday; 
    NSInteger differenceDays = (desiredWeekday - currentWeekday + daysInWeek) % daysInWeek; 

    NSDateComponents *daysComponents = [[NSDateComponents alloc] init]; 
    daysComponents.day = differenceDays; 
    NSDate *fireDate = [[NSCalendar currentCalendar] dateByAddingComponents:daysComponents toDate:[NSDate date] options:0]; 

    NSDateComponents *timeComponents = [[NSCalendar currentCalendar] components:  NSCalendarUnitHour | NSCalendarUnitMinute fromDate:time]; 
    NSDateComponents *fireDateComponents = [[NSCalendar currentCalendar] 
       components: NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond 
       fromDate:fireDate]; 

    fireDateComponents.hour = timeComponents.hour; 
    fireDateComponents.minute = timeComponents.minute; 
    fireDateComponents.second = 0; 

    NSDate *resultDate = [[NSCalendar currentCalendar] dateFromComponents:fireDateComponents]; 

    // The day could be today but time is in past. If so, move ahead to next week 
    if(resultDate.timeIntervalSinceNow < 0) { 
     resultDate = [resultDate dateByAddingTimeInterval:60 * 60 * 24 * 7]; 
    } 

    return resultDate; 
} 
+0

Oren, wie geht In den letzten paar Stunden versuche ich, deinen Code zu verstehen, es ist genau das, was ich brauche, aber es scheint nicht zu funktionieren.Bitte kontaktiere mich so schnell du kannst, ich habe an etwas für 3 Tage gearbeitet und immer noch nicht Stellen Sie sich diesen einfachen Teil vor lol. Toda Ahi :) [email protected] –

0

Diese Lösung auch Zeit in Betracht zieht, aber es ist ein bisschen mehr vereinfacht als Orens

-(NSDate *) dateOfSpecificDay:(NSInteger) day withFireTime:(NSDate *)timeDate/// here day will be 1 or 2.. or 7 and timeDate the current day with the desired time 
{ 
    NSInteger desiredWeekday = day; 
    NSRange weekDateRange = [[NSCalendar currentCalendar] maximumRangeOfUnit:NSCalendarUnitWeekday]; 
    NSInteger daysInWeek = weekDateRange.length - weekDateRange.location + 1; 

    NSDateComponents *dateComponents = [[NSCalendar currentCalendar] components:NSCalendarUnitWeekday fromDate:[NSDate date]]; 
    NSInteger currentWeekday = dateComponents.weekday; 
    NSInteger differenceDays = (desiredWeekday - currentWeekday + daysInWeek) % daysInWeek; 
    if (differenceDays == 0) { 
     //Check if should register for same day or for next week 
     if ([timeDate compare:[NSDate date]] == NSOrderedAscending) { 
      //Should schedule for next week 
      differenceDays = daysInWeek; 
     } 
    } 

    NSDateComponents *daysComponents = [[NSDateComponents alloc] init]; 
    daysComponents.day = differenceDays; 
    NSDate *resultDate = [[NSCalendar currentCalendar] dateByAddingComponents:daysComponents toDate:timeDate options:0]; 

    return resultDate; 
} 
0

Hier ist die rasche Version:

func calculateTheNExtFriday(inputTime: NSDate) -> NSDate { 
    let desiredWeekday = 6 // Friday 

    let weekDateRange = NSCalendar.currentCalendar().maximumRangeOfUnit(NSCalendarUnit.Weekday) 
    let daysInWeek = weekDateRange.length - weekDateRange.location + 1; 

    let currentWeekday = NSCalendar.currentCalendar().components(NSCalendarUnit.Weekday, fromDate: inputTime).weekday 
    let differenceDays = (desiredWeekday - currentWeekday + daysInWeek) % daysInWeek 

    let dateComponents = NSDateComponents() 
    dateComponents.day = differenceDays 

    let calculatedFridayDate = NSCalendar.currentCalendar().dateByAddingComponents(dateComponents, toDate: inputTime, options: NSCalendarOptions.init(rawValue: 0)) 
    return calculatedFridayDate! 
} 

In diesem Beispiel Ich verwende den gewünschten Wochentag innerhalb der Funktion, aber Sie können ihn auch als Parameter verwenden.

NB: Beachten Sie, dass der Tag 1 entspricht Sonntag, 2 -> Montag und so weiter

0

Swift 3:

func calculateSpecificDay(_ desiredWeekday: NSInteger, fromDate: Date = Date()) -> Date { 

    let weekDateRange = NSCalendar.current.maximumRange(of: .weekday)! 
    let daysInWeek = weekDateRange.lowerBound.distance(to: weekDateRange.upperBound) - weekDateRange.lowerBound + 1 

    let currentWeekday = NSCalendar.current.dateComponents([.weekday], from: fromDate).weekday 
    let differenceDays = (desiredWeekday - currentWeekday! + daysInWeek) % daysInWeek 

    var dateComponents = DateComponents() 
    dateComponents.day = differenceDays 

    let calculatedFridayDate = NSCalendar.current.date(byAdding: dateComponents, to: fromDate) 
    return calculatedFridayDate! 
} 
If selected day is sunday then pass 1 
If selected day is monday then pass 2 
. 
. 
. 
If selected day is saturday then pass 7 
Verwandte Themen