2014-01-31 3 views
6

Мне нужно установить UILocalNotification, мне нужно только час и минуту принимать DatePicker и вам нужно установить конкретную дату (например: понедельник) и повторять его каждый понедельник.Повторить UILocalNotification на конкретный день

У меня есть два вопроса по этому поводу:

Первый из них; возможно ли показывать только «имена дней», например «воскресенье» в разделе даты выбора даты?

Второй вопрос: Каковы правильные коды, если я хочу установить конкретную дату для локального уведомления?

Благодарим вас за ответы, и вот мой код ниже;

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

Проверить - http://useyourloaf.com/blog/2010/09/13/repeating-an-ios-local-notification.html или вы c а также получить некоторую помощь от http://stackoverflow.com/questions/14769462/set-repeatinterval-in-local-notification или http://stackoverflow.com/questions/18014438/repeating-a-local-notification-after- каждые-14-дневные недели-недели – Bharat

ответ

8

Вопрос 1 => Я не могу понять, что вы хотите. (Но если вы хотите, чтобы отобразить только имя дней, таких как воскресенье, понедельник, .... в субботу затем использовать UIPickerView.)

Вопрос 2 =>ДА вы можете получить правильный дата определенного дня, и вы можете получить уведомление о каждом определенного дня множество localNotification.repeatInterval = NSWeekCalendarUnit;

для достижения этого также необходимо использовать следующий кусок коды (методы). Этот метод возвращает правильную дату конкретного выбранного дня, вам просто нужно пройти день в качестве параметра метода, такие как,

Если выбран день воскресенье затем передать
Если выбранный день Понедельник затем перейдите
.
.
.
Если выбран день субботу затем пройти

Вот метод Код:

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

И не забудьте установить localNotification.repeatInterval = NSWeekCalendarUnit;

+0

Большое спасибо за ваш ответ, но мне нужно немного больше помочь в ответе нет: 2. можно ли получить примерный код о том, как использовать свой ответ с настройкой выбора даты? я не совсем уверен, где я должен это реализовать :(спасибо вам большое @iPatel – Rick

+1

Проведя пару часов, чтобы понять ваш метод, тогда я его реализую, и теперь он отлично работает! Спасибо @iPatel. – Rick

0

Вот @ решение iPatel, что также факторы в компоненте времени, прошедшем через datepicker. (Я также обновил его решение, чтобы использовать последние единицы календаря, которые не устарели).

- (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, How are вы? последние пару часов я пытаюсь понять ваш код, это именно то, что мне нужно, но оно не работает. Пожалуйста, свяжитесь со мной так быстро, как вы можете, я работал над чем-то в течение 3 дней и до сих пор не имею рисуйте эту простую часть lol. Toda Ahi :) [email protected] –

0

Это решение также требует времени на счет, но это немного более упрощенным, чем Орена

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

Вот версия быстры:

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

В этом примере, Я использую функцию alwaysWeekday внутри функции, но вы также можете использовать ее как параметр.

NB: Имейте в виду, что день 1 соответствует воскресенье, 2 -> понедельник и так далее

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 
Смежные вопросы