具有多个部分时使用sectionIndexTitlesForTableView进行索引

时间:2013-01-08 02:05:26

标签: objective-c ios uitableview uiscrollview indexing

我有一个表格视图,其中我使用sectionIndexTitlesForTableView来显示索引。我必须显示位于不同国家的大学列表。每个国家/地区都可以拥有多所大学,因此表格显示如下:

 1. Ecuador
    1. Universidad Catolica del Ecuador
 2. El Salvador
    1. Universidad Don Bosco
 3. Estonia
    4. Tallin University
    4. Tartu Health Care College
    4. University of Tartu
 4. Finland
    5. Aalto University

....

我打算做的是,使用侧面的滚动搜索,当用户触摸“A”时,它将带您到第一个带有字母A的条目。例如,当我按“E”时,它应该采取我到“厄瓜多尔”部分(显示在上面的“图像”上)。

问题来自一开始,因为我有多个部分,当我按下“B”时它会带我去“澳大利亚”,第二部分(第一部分是阿根廷)而不是带我去“比利时”,这将是第一个有B字母的国家。我设法解决了这个问题,但它给了我错误。这是代码:

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
{
   return [[UILocalizedIndexedCollation currentCollation] sectionIndexTitles];
}


- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
{
    NSArray* bu =[self SectionsASaltar];
    int ins =[[bu objectAtIndex:index] intValue];

    return [[UILocalizedIndexedCollation currentCollation] sectionForSectionIndexTitleAtIndex:ins];

}


-(NSArray*)SectionsASaltar
{
    NSArray* ALF= [[NSArray alloc] initWithObjects:@"A",@"B",@"C",@"D",@"E",@"F",@"G",@"H",@"I",@"J",@"K",@"L",@"M",@"N",@"O",@"P",@"Q",@"R",@"S",@"T",@"U",@"V",@"W",@"X",@"Y",@"Z", nil];


    NSMutableArray* jumps =[[NSMutableArray alloc]initWithObjects:@"0", nil];

    int i=0; //contador de elementos
    int j=0; //contador del alfabeto

    [titl addObject:[self.secc objectAtIndex:i]];
    do {

        if ([[self.secc objectAtIndex:i] hasPrefix:[ALF objectAtIndex:j]]) {
            i++;
        }else{
            [jumps addObject:[NSString stringWithFormat:@"%d",i]];
            i++;
            j++;

        }

    } while (i<[self.secc count]);

    [jumps addObject:[NSString stringWithFormat:@"0"]];
    NSLog(@"%@",jumps);
    return jumps;
}

其中 self.secc 是我的数组,其中的部分和 jumps 是一个数组,其中包含我必须跳过索引的元素数量以获得下一个字母。

上面代码的想法是计算有多少元素具有字母A,存储并在用户按B时跳过它们,因此它将直接转到第一个字母B.它适用于大多数字母但是一旦我按下字母M,它就会给我以下错误:

*** Terminating app due to uncaught exception 'NSRangeException', reason: '-[__NSCFArray objectAtIndex:]: index (29) beyond bounds (28)'
*** First throw call stack:
(0x25f9012 0x21c6e7e 0x25f8deb 0x25ed7e0 0x13137be 0x1dcd2 0x10d27ee 0x21da705 0x102e920 0x102e8b8 0x10ef671 0x10efbcf 0x124396d 0x12439a6 0x10ee7e2 0x105e16d 0x105e552 0x103c3aa 0x102dcf8 0x32b3df9 0x32b3ad0 0x256ebf5 0x256e962 0x259fbb6 0x259ef44 0x259ee1b 0x32b27e3 0x32b2668 0x102b65c 0x2bbd 0x2af5 0x1)
libc++abi.dylib: terminate called throwing an exception
(lldb)

我真的不知道我超越界限的地方,我认为这是在线:

  

return [[UilocalizedIndexedCollat​​ion currentCollat​​ion]   sectionForSectionIndexTitleAtIndex:插件];

但我不知道该声明是如何运作的,所以我不知道如何解决它。有任何想法吗? 此外,这是我的索引的最佳方法,还是有一种更简单的方法来管理相同的字母部分。我知道我可以提出另一种观点,然后第一种观点只有国家通过信件排序,第二种观点是大学,但我试图避免这种情况。

1 个答案:

答案 0 :(得分:0)

您的代码假定字母表中的每个字母都有一个条目。如果没有,那么它将增加i和J,跳过活动条目。因此,如果您有一个以字母a,c,d,e开头的数组,那么您的代码将使用a测试a,然后使用b测试c,递增两个索引器,在下一个循环中,它将使用c而不是c测试d与c。因为你继续递增j,你可以超过你的项目索引。