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」を押すと、最初の国である「ベルギー」ではなく、2 番目のセクション (最初はアルゼンチン) の「オーストラリア」に移動します。 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:ins];

しかし、そのステートメントがどのように機能するかがわからないため、修正する方法がわかりません。何か案は?また、これはインデックス作成に最適な方法ですか、それとも同じ文字のセクションを管理する簡単な方法はありますか。別のビューを作成して、最初のビューに文字で並べられた国のみを表示し、2 番目のビューに大学を表示できることはわかっていますが、それを避けようとしています。

4

1 に答える 1

0

コードは、アルファベットのすべての文字にエントリがあることを前提としています。そうでない場合は、アクティブなエントリをスキップして、iとJの両方をインクリメントします。したがって、文字a、c、d、eで始まる配列がある場合、コードはaをaでテストし、次にcをbでテストし、両方のインデクサーをインクリメントし、次のループでdをcではなくcでテストします。 cで。jを増やし続けるので、アイテムのインデックスを超えることができます。

于 2013-01-08T07:25:45.683 に答える