如何实现上个月/下个月按钮并显示当月的日期?

2023-12-23

设想:

我有一个费用跟踪 iOS 应用程序,我将费用详细信息视图控制器中的费用存储到表视图(带有获取的结果控制器)中,该表视图显示费用列表以及类别、金额和日期。我的实体“金钱”中确实有一个日期属性,它是支出或收入的父实体。

问题:

我想要的是基本上按月对我的费用进行分类,并将其显示为部分标题标题,例如:(2012 年 11 月 1 日 - 11 月 30 日),它根据该特定月份显示费用金额和相关内容。该视图中提供了两个按钮,如果我按右侧按钮,它会将月份增加一个月(2012 年 12 月 1 日 - 12 月 31 日),类似地,左侧按钮会将月份减少一个月。

我将如何实现这一目标?我正在尝试下面的代码 - 这有点工作。假设我当前的节标题为(Nov1 - Nov 30, 2012),当我按左按钮时,它给我节标题(Oct 1 - Oct 30, 2012),这是错误的,它应该是 Oct 31, 2012而不是 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;
}

然后我有一个名为“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);
} 

我做得对吗?或者有更好的方法来实现这一目标?任何帮助将不胜感激。


以下是一些应该可以实现您想要的功能的方法:

首先,在 viewDidLoad 方法中添加:

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

这为您提供了一个起点。然后,我添加了以下五个方法(注: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]);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何实现上个月/下个月按钮并显示当月的日期? 的相关文章

随机推荐