如何在UILocalizedIndexedCollat​​ion中将汉字排序为#

时间:2014-01-06 04:16:53

标签: ios objective-c uitableview uilocalizedcollation

我想知道如何将汉字分成“#”而不是A-Z。

非常感谢任何评论。

-(NSArray *)partitionObjects:(NSArray *)array collationStringSelector:(SEL)selector
{
    self.collation = [UILocalizedIndexedCollation currentCollation];
    NSInteger sectionCount = [[self.collation sectionTitles] count];//section count is take from sectionTitles and not sectionIndexTitles
    NSMutableArray *unsortedSections = [NSMutableArray arrayWithCapacity:sectionCount];
    //create an array to hold the data for each section
    for(int i = 0; i < sectionCount; i++)
    {
        [unsortedSections addObject:[NSMutableArray array]];
    }
    //put each object into a section
    for (id object in array)
    {
        NSInteger index = [self.collation sectionForObject:object collationStringSelector:selector];
        [[unsortedSections objectAtIndex:index] addObject:object];
    }
    NSMutableArray *sections = [NSMutableArray arrayWithCapacity:sectionCount];
    //sort each section
    for (NSMutableArray *section in unsortedSections)
    {
        [sections addObject:[self.collation sortedArrayFromArray:section collationStringSelector:selector]];
    }
    return sections;
}

enter image description here

1 个答案:

答案 0 :(得分:0)

这就是我最终做的事情

-(NSArray *)partitionObjects:(NSArray *)array collationStringSelector:(SEL)selector
{
    self.collation = [UILocalizedIndexedCollation currentCollation];
    NSInteger sectionCount = [[self.collation sectionTitles] count];//section count is take from sectionTitles and not sectionIndexTitles
    NSMutableArray *unsortedSections = [NSMutableArray arrayWithCapacity:sectionCount];

    //create an array to hold the data for each section
    for(int i = 0; i < sectionCount; i++)
    {
        [unsortedSections addObject:[NSMutableArray array]];
    }

    if ([self.catString isEqualToString:ARTISTS])
    {
        //put each object into a section
        for (id object in array)
        {
            if (!object)
            {
                continue;
            }
            NSInteger index = [self.collation sectionForObject:object collationStringSelector:selector];
            [[unsortedSections objectAtIndex:index] addObject:object];
        }
    }
    else
    {
        NSInteger index;
        for (id object in array)
        {
            Song *songItem = object;
            NSString* charIndex;

            if([songItem.songName length]<=2)
            {
                charIndex = [songItem.songName substringToIndex:1];
            }
            else if([songItem.songName length]<=3)
            {
                charIndex = [songItem.songName substringToIndex:2];
            }
            else if([songItem.songName length]<=4)
            {
                charIndex = [songItem.songName substringToIndex:3];
            }
            else if([songItem.songName length]>=5)
            {
                charIndex = [songItem.songName substringToIndex:4];
            }
            NSRegularExpression *regex = [[NSRegularExpression alloc]
                                           initWithPattern:@"[a-zA-Z]" options:0 error:NULL];
            NSUInteger matches = [regex numberOfMatchesInString:charIndex options:0
                                                          range:NSMakeRange(0, [charIndex length])];
            if (matches >=2)
            {
                index = [self.collation sectionForObject:object collationStringSelector:selector];
                [[unsortedSections objectAtIndex:index] addObject:object];
            }
            else
            {
                index = 26; //add object to last index "#"
                [[unsortedSections objectAtIndex:index] addObject:object];
            }
            songItem = nil;
        }
    }
    NSMutableArray *sections = [NSMutableArray arrayWithCapacity:sectionCount];

    //sort each section
    for (NSMutableArray *section in unsortedSections)
    {
        [sections addObject:[self.collation sortedArrayFromArray:section collationStringSelector:selector]];
    }
    return sections;
}