3

怎么UILocalizedIndexedCollation工作?

我正在阅读文档中的simpleIndexedTableView 示例代码RootViewController,已初始化,我们向它发送了一些数据(rootViewController.timeZonesArray = timeZones;),但此时,collation已在视图控制器中使用:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    // The number of sections is the same as the number of titles in the collation.
    return [[collation sectionTitles] count];
}

基本上这就是魔法似乎发生的地方,那么 [collation sectionTitles]包含什么?有些东西必须是自动的,但我不明白整个事情是如何运作的?

- (void)configureSections {

    // Get the current collation and keep a reference to it.
    self.collation = [UILocalizedIndexedCollation currentCollation];

    NSInteger index, sectionTitlesCount = [[collation sectionTitles] count];

    NSMutableArray *newSectionsArray = [[NSMutableArray alloc] initWithCapacity:sectionTitlesCount];

    // Set up the sections array: elements are mutable arrays that will contain the time zones for that section.
    for (index = 0; index < sectionTitlesCount; index++) {
        NSMutableArray *array = [[NSMutableArray alloc] init];
        [newSectionsArray addObject:array];
        [array release];
    }

    // Segregate the time zones into the appropriate arrays.
    for (TimeZoneWrapper *timeZone in timeZonesArray) {

        // Ask the collation which section number the time zone belongs in, based on its locale name.
        NSInteger sectionNumber = [collation sectionForObject:timeZone collationStringSelector:@selector(localeName)];

        // Get the array for the section.
        NSMutableArray *sectionTimeZones = [newSectionsArray objectAtIndex:sectionNumber];

        //  Add the time zone to the section.
        [sectionTimeZones addObject:timeZone];
    }

    // Now that all the data's in place, each section array needs to be sorted.
    for (index = 0; index < sectionTitlesCount; index++) {

        NSMutableArray *timeZonesArrayForSection = [newSectionsArray objectAtIndex:index];

        // If the table view or its contents were editable, you would make a mutable copy here.
        NSArray *sortedTimeZonesArrayForSection = [collation sortedArrayFromArray:timeZonesArrayForSection collationStringSelector:@selector(localeName)];

        // Replace the existing array with the sorted array.
        [newSectionsArray replaceObjectAtIndex:index withObject:sortedTimeZonesArrayForSection];
    }

    self.sectionsArray = newSectionsArray;
    [newSectionsArray release]; 
}

谢谢你的帮助

4

1 回答 1

5

[collation sectionTitles]只包含标准的字母排序,以便在表格视图的右侧显示。即使您只有以“B”和“F”开头的项目,侧面的索引也始终显示完整的字母表。但是由于用于对字符串进行排序的标准字母表会根据区域设置而变化,Apple 让我们UILocalizedIndexedCollation可以轻松地向用户展示他们的期望。

于 2012-04-16T17:30:20.610 回答