Jak zaimplementować przyciski poprzedniego / następnego miesiąca i pokazać daty dla bieżącego miesiąca?

Scenariusz:

Mam śledzenie wydatków aplikacji iOS i przechowuję wydatki z kontrolera widoku szczegółów wydatków w widoku tabeli (z pobranym kontrolerem wyników), który pokazuje listę wydatków wraz z kategorią i kwotą oraz datą. Mam atrybut daty w mojej jednostce „Pieniądze”, który jest jednostką dominującą albo dla wydatku, albo dla dochodu.

Pytanie:

Chcę, aby w zasadzie co miesiąc klasyfikować moje wydatki i wyświetlać je jako tytuł nagłówka sekcji, na przykład: (1 listopada - listopad 30,2012) i pokazuje kwotę wydatków oraz powiązane rzeczy według tego konkretnego miesiąca. W tym widoku znajdują się dwa przyciski, jeśli nacisnę prawy przycisk, zwiększy on miesiąc o miesiąc (1 grudnia - 31 grudnia 2012) i podobnie lewy przycisk zmniejszy miesiąc o miesiąc.

Jak mógłbym to osiągnąć? Próbuję następującego kodu - który działa trochę. Przypuśćmy, że mam swój aktualny nagłówek sekcji jako (1 listopada - 30 listopada 2012 r.), A gdy nacisnę lewy przycisk, otrzymuję nagłówek sekcji (1 października - 30 października 2012 r.), Który jest nieprawidłowy, powinien być 31 października 2012 r. a nie 30 października 2012 r.

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

Następnie mam metodę zwaną „monthCalculation”, w której nazywam powyższe dwie metody.

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

Teraz następujący kod po naciśnięciu lewego przycisku (aby zmniejszyć miesiąc o miesiąc):

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

Poniższy kod po naciśnięciu prawego przycisku (aby zwiększyć miesiąc o miesiąc):

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

Czy robię to dobrze? czy istnieje lepszy sposób na osiągnięcie tego? Każda pomoc zostanie doceniona.

questionAnswers(2)

yourAnswerToTheQuestion