我有一个充满日期的tableview。我的节标题是月份名称。您可以在here上看到我的桌面视图。
我想要的是它滚动到当时那个月的部分。为了设置我的节标题,我使用这种方法。
id <NSFetchedResultsSectionInfo> theSection = [[self.fetchedResultsController sections] objectAtIndex:section];
static NSArray *monthSymbols = nil;
NSArray *dutchMonths = [[NSArray alloc]initWithObjects:@"Januari",@"Februari",@"Maart",@"April",@"Mei",@"Juni",@"Juli",@"Augustus",@"September",@"Oktober",@"November",@"December", nil];
if (!monthSymbols) {
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setCalendar:[NSCalendar currentCalendar]];
[formatter setMonthSymbols:dutchMonths];
monthSymbols = [formatter monthSymbols];
}
NSLog(@"%@",monthSymbols);
NSInteger numericSection = [[theSection name] integerValue];
NSInteger year = numericSection / 1000;
NSInteger month = numericSection - (year * 1000);
NSString *titleString = [NSString stringWithFormat:@"%@", [monthSymbols objectAtIndex:month-1]];
label.text = titleString;
我已经知道我必须使用这种方法。
[sampleListTableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
但是如何获得正确行的索引路径?
有任何帮助吗?如果您需要更多细节。请帮忙。
亲切的问候。
答案 0 :(得分:0)
看起来你可以通过循环遍历sections数组(来自self.fetchedResultsController)并将从相关对象获得的月份与当前日期的月份进行比较来获得索引。如果你有匹配,那么你的indexPath将是:
NSIndexPath *path = [NSIndexath indexPathForRow:0 inSection:foundIndex];
您还应该将dutchMonths数组设置为静态,以便每次调用该方法时都不会创建它。此外,如果您不使用ARC,它会泄漏(除非未发布发布代码)。一般的经验法则是使日期格式化程序也是静态的,或者以某种方式管理它的一个实例,因为这是一个昂贵的操作。我知道使用这段代码它只创建一次,因为你只用它来填充monthSymbols数组,但如果你需要在其他代码中使用相同的格式化程序,那么你将要重写它。
要完成所有这些操作,您应该在此方法中提取逻辑并将其放在较小的,可重复使用的方法中,例如
- (NSInteger)monthFromSection:(id<NSFetchedResultsSectionInfo>)section;
然后你可以写:
NSIndexPath *path = nil;
NSInteger currentMonth = // Calculate month from date returned by [NSDate date]
NSArray *sections = [self.fetchedResultsController sections];
for (int i = 0; i < sections.count; i++)
{
if (currentMonth = [self monthFromSection:[sections objectAtIndex:i]])
{
path = [NSIndexPath indexPathForRow:0 inSection:i];
break;
}
}