Как реализовать кнопки предыдущего / следующего месяца и показать даты текущего месяца?

Сценарий:

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

Вопрос:

Я хочу в основном классифицировать мои расходы ежемесячно и отображать их в виде заголовка раздела, например: (1 ноября - 30,2012), и он показывает сумму расходов и связанные с ними данные в соответствии с конкретным месяцем. В этом представлении предусмотрены две кнопки: если я нажму правую кнопку, она будет увеличивать месяц на месяц (1 декабря - 31 декабря 2012 г.), и аналогичным образом левая кнопка будет уменьшать месяц на месяц.

Как мне это сделать? Я пытаюсь следующий код - который вроде работает. Предположим, у меня есть текущий заголовок раздела (1 ноября - 30 ноября 2012 г.), и когда я нажимаю левую кнопку, он дает мне заголовок раздела (1 октября - 30 октября 2012 г.), что неверно, это должно быть 31 октября 2012 г. а не 30 октября 2012 года.

- (NSDate *)firstDateOfTheMonth
{
    self.startDate = [NSDate date];

    NSCalendar* calendar = [NSCalendar currentCalendar];

    [calendar setTimeZone:[NSTimeZone localTimeZone]];

    NSDateComponents* components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:self.startDate];

    [components setDay:1];

    firstDateOfTheMonth = [[calendar dateFromComponents:components] retain];

    return firstDateOfTheMonth;

}

- (NSDate *)lastDateOfTheMonth
{
    NSCalendar* calendar = [NSCalendar currentCalendar];

    [calendar setTimeZone:[NSTimeZone localTimeZone]];

    NSDateComponents* components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:firstDateOfTheMonth];

    [components setMonth:[components month]+1];
    [components setDay:0];

    lastDateOfTheMonth = [[calendar dateFromComponents:components] retain];

    return lastDateOfTheMonth;
}

Тогда у меня есть метод под названием "monthCalculation» в котором я называю два вышеупомянутых метода.

- (void)monthCalculation
{
    [self firstDateOfTheMonth];
    [self lastDateOfTheMonth];
}

Теперь следующий код, когда я нажимаю левую кнопку (чтобы уменьшить месяц на месяц):

- (IBAction)showPreviousDates:(id)sender
{
    [self monthCalculation];

    NSDateComponents *dateComponents = [[[NSDateComponents alloc] init] autorelease];
    [dateComponents setMonth:-1];

    NSDate *newDate1 = [[NSCalendar currentCalendar]
                        dateByAddingComponents:dateComponents
                        toDate:firstDateOfTheMonth options:0];

    NSDate *newDate2 = [[NSCalendar currentCalendar]
                        dateByAddingComponents:dateComponents
                        toDate:lastDateOfTheMonth options:0];

    self.startDate = newDate1;
    self.endDate = newDate2;

    NSLog(@" self start date in previous mode =%@", self.startDate);
    NSLog(@" self end date in previous mode =%@", self.endDate);
} 

Следующий код, когда я нажимаю правую кнопку (чтобы увеличить месяц на месяц):

- (IBAction)showNextDates:(id)sender
{
    [self monthCalculation];

    NSDateComponents *dateComponents = [[[NSDateComponents alloc] init] autorelease];
    [dateComponents setMonth:1];

    NSDate *newDate1 = [[NSCalendar currentCalendar]
                        dateByAddingComponents:dateComponents
                        toDate:firstDateOfTheMonth options:0];

    NSDate *newDate2 = [[NSCalendar currentCalendar]
                        dateByAddingComponents:dateComponents
                        toDate:lastDateOfTheMonth options:0];

    self.startDate = newDate1;
    self.endDate = newDate2;

    NSLog(@" self start date in previous mode =%@", self.startDate);
    NSLog(@" self end date in previous mode =%@", self.endDate);
} 

Я делаю это правильно? или есть лучший способ добиться этого? Любая помощь будет оценена.

Ответы на вопрос(2)

Ваш ответ на вопрос