0

シナリオ:

私は経費追跡iOSアプリケーションを持っており、経費詳細ビューコントローラーからの経費をカテゴリと金額および日付とともに経費のリストを表示するテーブルビュー(フェッチされた結果コントローラーを含む)に保存しています。私のエンティティ「Money」には、費用または収入のいずれかの親エンティティである日付属性があります。

質問:

基本的には月ごとに経費を分類して、たとえば(2012年11月1日〜11月30日)のセクションヘッダータイトルとして表示し、その月ごとの経費額などを表示したいです。そのビューには2つのボタンがあります。右ボタンを押すと、月が1か月ずつ増加し(2012年12月1日から12月31日)、同様に左ボタンを押すと月が1か月ずつ減少します。

どうすればそれを達成できますか?私は次のコードを試しています-これはちょっと機能しています。現在のセクションヘッダーが(Nov1-2012年11月30日)で、左ボタンを押すとセクションヘッダー(2012年10月1日-2012年10月30日)が間違っていると仮定します。これは2012年10月31日である必要があります。 2012年10月30日ではありません。

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

次に、上記の2つのメソッドを呼び出す「monthCalculation」というメソッドがあります。

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

左ボタンを押すと、次のコードが表示されます(月を1か月ずつデクリメントするため)。

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

右ボタンを押すと、次のコードが表示されます(月を1か月ずつインクリメントするため)。

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

私はそれを正しくやっていますか?またはこれを達成するためのより良い方法がありますか?どんな助けでもありがたいです。

4

2 に答える 2

7

これがあなたが望むことをするべきいくつかの方法です:

まず、viewDidLoadメソッドに次を追加します。

self.startDate = [NSDate date];
[self updateDateRange];

これはあなたに出発点を与えます。次に、次の5つの方法を追加しました(注:previousMonthButtonPressed/nextMonthButtonPressedはボタンに接続する必要があります)。

// Return the first day of the month for the month that 'date' falls in:
- (NSDate *)firstDayOfMonthForDate:(NSDate *)date
{
    NSCalendar *cal         = [NSCalendar currentCalendar];
    NSDateComponents *comps = [cal components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit
                                     fromDate:date];
    comps.day               = 1;
    return [cal dateFromComponents:comps];
}

// Return the last day of the month for the month that 'date' falls in:
- (NSDate *)lastDayOfMonthForDate:(NSDate *)date
{
    NSCalendar *cal         = [NSCalendar currentCalendar];
    NSDateComponents *comps = [cal components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit
                                     fromDate:date];
    comps.month             += 1;
    comps.day               = 0;
    return [cal dateFromComponents:comps];
}

// Move the start date back one month
- (IBAction)previousMonthButtonPressed:(id)sender {
    NSCalendar *cal         = [NSCalendar currentCalendar];
    NSDateComponents *comps = [cal components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit
                                     fromDate:self.startDate];
    comps.month             -= 1;
    self.startDate          = [cal dateFromComponents:comps];
    [self updateDateRange];
}

// Move the start date forward one month
- (IBAction)nextMonthButtonPressed:(id)sender {
    NSCalendar *cal         = [NSCalendar currentCalendar];
    NSDateComponents *comps = [cal components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit
                                     fromDate:self.startDate];
    comps.month             += 1;
    self.startDate          = [cal dateFromComponents:comps];
    [self updateDateRange];
}

// Print the new range of dates.
- (void)updateDateRange
{
    NSLog(@"First day of month: %@", [self firstDayOfMonthForDate:self.startDate]);
    NSLog(@"Last day of month: %@",  [self lastDayOfMonthForDate:self.startDate]);
}
于 2012-11-16T04:45:52.290 に答える
0

これを試して:

- (NSDate *)lastDateOfTheMonth
{
    NSCalendar* calendar = [NSCalendar currentCalendar];
    [calendar setTimeZone:[NSTimeZone localTimeZone]];

    NSDateComponents* components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:firstDateOfTheMonth];
    [components setMonth:[components month]+1];

    NSDateComponents* offset = [[[NSDateComponents alloc] init] retain];
    [offset setDay:-1];

    lastDateOfTheMonth = [[calendar dateByAddingComponents:offset toDate:[components date] options:0] retain];
    return lastDateOfTheMonth;
}
于 2012-11-16T04:09:59.797 に答える