2011-09-13 9 views
17

大きなUITableViewのスクロールを高速化するためにUITableViewインデックスを作成しようとしていますが、右にインデックスが表示されていますが、スクロールしようとすると機能しません..UITableViewをインデックスでスクロール可能にする

screenshot

私は何かを見逃してしまったのだろうかと思っているので、何か他に何かがあるか、それとも何かがあるかどうか疑問に思っています。

#pragma - TableView Index Scrolling 

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView { 

    if(searching) 
     return nil; 

    NSMutableArray *tempArray = [[NSMutableArray alloc] init]; 
    [tempArray addObject:@"A"]; 
    [tempArray addObject:@"B"]; 
    [tempArray addObject:@"C"]; 
    [tempArray addObject:@"D"]; 
    [tempArray addObject:@"E"]; 
    [tempArray addObject:@"F"]; 
    [tempArray addObject:@"G"]; 
    [tempArray addObject:@"H"]; 
    [tempArray addObject:@"I"]; 
    [tempArray addObject:@"J"]; 
    [tempArray addObject:@"K"]; 
    [tempArray addObject:@"L"]; 
    [tempArray addObject:@"M"]; 
    [tempArray addObject:@"N"]; 
    [tempArray addObject:@"O"]; 
    [tempArray addObject:@"P"]; 
    [tempArray addObject:@"Q"]; 
    [tempArray addObject:@"R"]; 
    [tempArray addObject:@"S"]; 
    [tempArray addObject:@"T"]; 
    [tempArray addObject:@"U"]; 
    [tempArray addObject:@"V"]; 
    [tempArray addObject:@"W"]; 
    [tempArray addObject:@"Y"]; 
    [tempArray addObject:@"X"]; 
    [tempArray addObject:@"Z"]; 

    return tempArray; 
} 

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index { 

    if(searching) 
     return -1; 

    return index % 2; 
} 

答えて

10

テーブルビューはアルファベット順にグループ化する必要があります私は考えています - temp配列は、選択した文字を特定のインデックスに変換する方法を知らない( "a"、 "b" "c"は意味する)。

iPodの曲のリストを見ると、各文字グループに文字区切り記号が付いていることがわかります。文字「A」を索引に変換するには、表オブジェクトを文字で表題のセクションにグループ化する必要があります。 AppleのiPodのリストが実際にやっていることは、最初の "A"項目にスクロールするのではなく、 "A"項目の先頭にスクロールすることです。

+0

大丈夫、あなたの返事のおかげで、可能性があると思った。これを理解するために周囲を読んでください。あなたがオンラインの例を知っていて、リンクがあれば、私はそれを高く評価します。 –

+0

ああこれは私が考えているこのステップでやっているようだと思う.http://www.iphonesdkarticles.com/2009/01/uitableview-sectioned-table-view.html –

+0

そうですね、それだけです。 –

2

あなたは試してみてください:

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index { 
    return index; 
} 

をそれはあなたのコントローラの残りの部分なしで間違っているものを言うのは難しいですが、私はそれが動作するはずだと思います。

+1

これは残念ながらうまくいきませんでした.. –

+0

あなたのテーブルビューはグループ化されているのでしょうか? –

+0

私の質問では、それはスクリーンショットです。私は同じ値を持っていると思いますか? –

43

あなたは、このセクションでは、セクションのタイトル/インデックスに対応するテーブルを告げる

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index 

(例えば、「B」、1))

この方法は、対応するセクションを返すためであるを使用することができますタイトル。しかし、これらのタイトルにしたがって、あなたの単一セクションの行をスクロールしたいとします。 だから、次の手順を実行します

  1. グローバル配列を作成しますが、.hファイルで宣言意味

    NSMutableArray *alphabetsArray; 
    NSMutableArray *dataArray; //--This contain your cell value i.e. Honda,Mazda--// 
    
  2. 以下、その後のUITableViewメソッドからそれを返すようviewDidLoad方法でそれを定義します。..

    alphabetsArray = [[NSMutableArray alloc] init]; 
    [alphabetsArray addObject:@"A"]; 
    [alphabetsArray addObject:@"B"]; 
    [alphabetsArray addObject:@"C"]; 
    [alphabetsArray addObject:@"D"]; 
    [alphabetsArray addObject:@"E"]; 
    [alphabetsArray addObject:@"F"]; 
    [alphabetsArray addObject:@"G"]; 
    [alphabetsArray addObject:@"H"]; 
    [alphabetsArray addObject:@"I"]; 
    [alphabetsArray addObject:@"J"]; 
    [alphabetsArray addObject:@"K"]; 
    [alphabetsArray addObject:@"L"]; 
    [alphabetsArray addObject:@"M"]; 
    [alphabetsArray addObject:@"N"]; 
    [alphabetsArray addObject:@"O"]; 
    [alphabetsArray addObject:@"P"]; 
    [alphabetsArray addObject:@"Q"]; 
    [alphabetsArray addObject:@"R"]; 
    [alphabetsArray addObject:@"S"]; 
    [alphabetsArray addObject:@"T"]; 
    [alphabetsArray addObject:@"U"]; 
    [alphabetsArray addObject:@"V"]; 
    [alphabetsArray addObject:@"W"]; 
    [alphabetsArray addObject:@"Y"]; 
    [alphabetsArray addObject:@"X"]; 
    [alphabetsArray addObject:@"Z"]; 
    

    [注:alphabetsArrayと動的 を作成すると、のdataArrayが含まれています。これは我々が

  3. 今すぐタイトル

    - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView { 
        return alphabetsArray; 
    } 
    
  4. はのUITableViewをスクロールするためにあなたのロジックを書く得るために、上記の方法を使用する]以下でダイナミックなセクションインデックスのタイトル配列を作成するにはどうすればよいをたどるための

    - (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index { 
        for (int i = 0; i< [dataArray count]; i++) { 
         // Here you return the name i.e. Honda,Mazda 
         // and match the title for first letter of name 
         // and move to that row corresponding to that indexpath as below 
         NSString *letterString = [[dataArray objectAtIndex:i] substringToIndex:1]; 
         if ([letterString isEqualToString:title]) { 
          [tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES]; 
          break; 
         } 
        } 
        return -1; 
    } 
    

****どのように我々は、動的セクションインデックスのタイトルの配列を作成することができます****

  1. することは、私たちがdataArrayは、動的セクションインデックスのタイトルを作成するための方法を作成することを

    [@"Honda",@"Maruti",@"Mazda",@"Toyota",.....] 
    
  2. のようなものであると仮定してみよう

    - (void)createAlphabetArray; 
    
  3. 以下のような配列は

    以下のようcreateAlphabetArray方法を実装しますあなたはalphabetsArrayが

    [self createAlphabetArray]; 
    

が含まれている変更したいとき

#pragma mark - Create Alphabet Array 
- (void)createAlphabetArray { 
    NSMutableArray *tempFirstLetterArray = [[NSMutableArray alloc] init]; 
    for (int i = 0; i < [dataArray count]; i++) { 
     NSString *letterString = [[dataArray objectAtIndex:i] substringToIndex:1]; 
     if (![tempFirstLetterArray containsObject:letterString]) { 
      [tempFirstLetterArray addObject:letterString]; 
     } 
    } 
    alphabetsArray = tempFirstLetterArray; 
    [tempFirstLetterArray release]; 
} 
  • は今、どこでもそれを呼び出す今すぐあなたのdataArrayの内容に応じて動的にダイナミックなセクションインデックスのタイトルの配列を作成することができます。

  • +0

    あなたはすべてのことをとても分かりやすくしましたので、私はもうチュートリアルを見る必要はありません...ありがとうございました:) – NightFury

    +0

    ありがとうあなたのコメントのため –

    +0

    非常に良い説明、私の問題を解決しました。ありがとうございました。 –

    関連する問題