0

我在这里尝试完成的是使用带有原型单元格的 tableView,并在每个单元格中显示一年或两年的日期。我已经使用以下代码在标签中显示今天的日期:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MM/dd/yyyy"];
NSDate *dateNow = [NSDate date];
dateArray = [NSMutableArray arrayWithObjects:[dateFormatter stringFromDate:dateNow], nil];

它可以将一个日期(今天的日期)添加到第一个单元格。我不知道如何让它以 1 的间隔增加所有天数。有什么帮助吗?

我使用以下代码在数组中显示信息:

static NSString *CellIdentifier = @"Cell";

Custom *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
cell.dateLabel.text = [dateArray objectAtIndex:indexPath.row];
4

2 回答 2

0

您不需要维护日期数组。如果要显示第n,只需在开始日期添加n天并使用它。

因此,您可以将开始日期存储在实例变量中:

NSDate *_startDate;

要确定 tableView 中应该有多少行,你必须弄清楚那一年有多少天(我假设你只显示一年):

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
  // get the calendar
  NSCalendar *calendar = [NSCalendar currentCalendar];

  // get the date that points to the first day of the first month of the year containing the start date
  // note that we include the era, because some calendars have more than an "AD"/"BC" kind of era
  NSDateComponents *yearStartComponents = [calendar components:(NSEraCalendarUnit | NSYearCalendarUnit) fromDate:_startDate];
  [yearStartComponents setMonth:1];
  [yearStartComponents setDay:1];
  NSDate *startOfYear = [calendar dateFromComponents:yearStartComponents];

  NSDateComponents *yearDiff = [[NSDateComponents alloc] init];
  [yearDiff setYear:1];

  // add one year to that date
  NSDate *startOfNextYear = [calendar dateByAddingComponents:yearDiff toDate:startOfYear options:0];

  // figure out how many days were between the two dates
  NSDateComponents *dayDiff = [calendar components:NSDayCalendarUnit fromDate:startOfYear toDate:startOfNextYear options:0];

  return [dayDiff day];
}

然后当您需要单元格时,您可以使用 indexPath 的“行”作为从开始日期开始的天数:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  UITableViewCell *cell = ...;

  NSCalendar *calendar = [NSCalendar currentCalendar];
  NSDateComponents *diff = [[NSDateComponents alloc] init];
  [diff setDay:[indexPath row]];
  NSDate *date = [calendar dateByAddingComponents:diff toDate:_startDate options:0];

  NSLocale *locale = [NSLocale currentLocale];
  NSString *formatted = [NSDateFormatter localizedStringFromDate:date dateStyle:NSDateFormatterShortStyle timeStyle:NSDateFormatterNoStyle locale:locale];

  [[cell textLabel] setText:formatted];

  return cell;
}

这种方法有几个好处:

  1. 无论一年的长度如何,它都有效。无论当年有 353、355、365、366 还是 384 天,它都可以。
  2. 无论当前日历如何,它都有效。那里不仅仅是公历。 NSCalendar支持公历、佛教、中国、希伯来、伊斯兰、伊斯兰民间、日本、中华民国、波斯、印度和 ISO8601 日历。
  3. 您没有对格式字符串进行硬编码。通过使用NSDateFormatterStyles,您将为日期使用适当的简写符号,无论是“5/12/12”还是“5 Dec '12”或完全不同的日期。
于 2012-12-06T05:04:04.157 回答
0

干得好,

在 viewDidload 中,

dateArray = [[NSMutableArray alloc] init];  //dateArray is global

NSDate *thisDate, *nextDate;
thisDate = [NSDate date];

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MM/dd/yyyy"];
[dateArray addObject: [dateFormatter stringFromDate:thisDate]];

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [[NSDateComponents alloc] init];
components.day = 1;

for (int i = 0; i<365; i++) //Not considering leap years
{
      nextDate = [gregorian dateByAddingComponents:components toDate:thisDate options:0];
       [dateArray addObject:[dateFormatter stringFromDate:nextDate]];
      thisDate = nextDate;
}

在 cellForRowAtIndexPath

cell.dateLabel.text = [dateArray objectAtIndex:indexPath.row];
于 2012-12-02T15:41:28.520 回答