您不需要维护日期数组。如果要显示第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;
}
这种方法有几个好处:
- 无论一年的长度如何,它都有效。无论当年有 353、355、365、366 还是 384 天,它都可以。
- 无论当前日历如何,它都有效。那里不仅仅是公历。
NSCalendar
支持公历、佛教、中国、希伯来、伊斯兰、伊斯兰民间、日本、中华民国、波斯、印度和 ISO8601 日历。
- 您没有对格式字符串进行硬编码。通过使用
NSDateFormatterStyles
,您将为日期使用适当的简写符号,无论是“5/12/12”还是“5 Dec '12”或完全不同的日期。