3

我有一个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)

我真的不知道我在哪里超越界限,我认为它在这条线上:

返回 [[UILocalizedIndexedCollat​​ion currentCollat​​ion] sectionForSectionIndexTitleAtIndex:ins];

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

4

1 回答 1

0

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

于 2013-01-08T07:25:45.683 回答