滚动到tableview中的某个点

时间:2012-10-30 15:58:42

标签: objective-c ios uitableview scroll

我有一个充满日期的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];

但是如何获得正确行的索引路径?

有任何帮助吗?如果您需要更多细节。请帮忙。

亲切的问候。

1 个答案:

答案 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;
    }
}