2009-06-30 11 views
0

インデックスを表示するのにsectionIndexTitlesForTableViewを使用しているテーブルビューがあります。ただし、テーブルをスクロールすると、インデックスがスクロールします。これにより、表のリフレッシュが非常に遅くなります。私が間違っていることが明らかな何かがありますか?私は、テーブルがスクロールしている間、インデックスが右の位置に残るようにします。これは、私がインデックスのタイトルに使用しているコードです:iphoneのインデックス付きテーブルビューの問題

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView { 
    NSMutableArray *tempArray = [[NSMutableArray alloc] init]; 
    [tempArray addObject:@"A"]; 
    [tempArray addObject:@"B"]; 
    [tempArray addObject:@"C"]; 
    [tempArray addObject:@"D"]; 
... 

    return tempArray; 
} 

答えて

1

私は新しいNSMutableArrayを作成して毎回解放しないでください。 viewDidLoadまたはクラスコンストラクタでそれらを作成し、事前に作成した配列をsectionIndexTitesForTableViewに参照してみてください。

アレイをまったく操作していない場合は、おそらくNSMutableArrayのオーバーヘッドは必要ありません。静的な自動解放コンストラクタarrayWithObjectsを使用して、それを普通の古いNSArrayに切り替えてみてください。

これはあなたのために物事をスピードアップする必要があります。

+0

アドバイスありがとうございます。私は今これを持っています: - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView { \t NSArray * tempArray = [NSArray arrayWithObjects:@ "A"、@ "B"、@ "C"、nil]; \t return tempArray; } しかし、それはまったく助けになりません(スクロールが完了するまでテーブルの内容は更新されません)。私は主な問題は、インデックスがテーブルと共にスクロールしていることだと思います。これは明らかに間違っています - 表のセルがスクロールしてもそれは変わりません。なぜこのことが起こっているのでしょうか? –

+0

"インデックスがテーブルと一緒にスクロールしている"ということはわかりません。そのコードでメソッドが呼び出されるたびに配列を作成しています。 – slf

+0

sectionIndexTitlesForTableViewを使用している場合は、tableView:sectionForSectionIndexTitle:atIndex:およびtableView:numberOfRowsInSection: – slf

3

他の場所(テーブルコントローラのinitやloadViewメソッドなど)でインデックスリストを作成し、後で使用するためにインスタンス変数として保持する必要があります。その後、sectionIndexTitlesForTableViewであなたはその象牙を返すだけです。属性が保持されているプロパティでない場合は、作成時に保持するようにして、周囲に張り付くようにしてください(そして、deallocで解放してください)。

self.alphabetIndex = [NSArray arrayWithArray: 
    [@"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|#" 
     componentsSeparatedByString:@"|"]]; 

実際の文字は言語のロケール設定に応じて変更する必要がありますが、この方法は、それはローカライズには少しは簡単です:

それを作成する簡単な方法です。

あなたは間違いなくそれがたくさん呼ばれることになるので、毎回その一時配列を作成したくありません。

インデックスがスクロールする限り、毎回新しい配列を返すことに関連している可能性があります。最初に上記を試してください。問題が解決しない場合は、テーブルのsectionIndexMinimumDisplayRowCountプロパティの値を微調整して、それが何か違いがあるかどうかを確認してください。

+0

も実装していることを確認してください。アレイの作成は毎回良い方法ではないと思っていました。提案する。私は今、alphabetArrayを返すだけです。しかし、それを行った後でも、インデックスはスクロールしてから、スクロールが終了した後にポップバックします。これは困惑している。なぜ世界でインデックスがスクロールするのでしょうか?インデックス自体をタップまたはスワイプすると、テーブルが適切にスクロールされます。 myTableView.sectionIndexMinimumDisplayRowCountをいくつかの異なる値(3,10,20)に設定しようとしました。違いはありませんでした。 –

+0

alphabetIndex(つまり27)の項目数に設定しようとすると、それが適切に維持されます。試すだけの価値があります。 – Ramin

+0

現在、テーブルの行数が27未満であるため、27に設定するとインデックスが表示されません。もちろん、テーブルはスクロールして完全に表示されます。しかし、インデックスを表示するたびに、スクロールが停止するまで表のスクロールはレンダリングされません。 –

-1

の度に、そのテンポラリアレイを作成したくないのは間違いです。

なぜこのメソッドは「たくさん呼ばれますか?

このインデックスを作成する必要はありません... sectionIndexTitlesForTableViewも一度だけ呼び出されませんか?

(私はテーブルを変更しない限り。)

+0

いいえ、テーブルの各セクションについて、テーブルが描画されるたびに呼び出されます。ユーザーのスクロール時および表データのリフレッシュ時を含む。 – cleverbit

+0

これは答えではありません。既存の回答について議論したい場合は、コメントを使用してください。 – KPM

1

は、それがアプリの終了時にリリースされる、静的変数を作成します。

static NSMutableArray* alphabet = nil; 

+ (void)initialize { 
    if(self == [MyViewController class]){ 
     NSUInteger const length = 'Z' - 'A' + 1; 
     alphabet = [[NSMutableArray alloc] initWithCapacity:length]; 
     for(NSUInteger i=0; i<length; ++i){ 
      unichar chr = 'A' + i; 
      [alphabet addObject:[NSString stringWithCharacters:&chr length:1]]; 
     } 
    } 
} 
関連する問題