1

iPhone で標準のナビゲーター インターフェイスを使用しています。最上位のテーブルビューから次のレベルに移動するとき、コア データから約 2000 レコードをロードする必要があり、これには 5 ~ 10 秒かかることがあるため、アクティビティ インジケーターを使用したいと考えています。

DidSelect メソッドのコードを削除すると機能する次のコードを実行しましたが、それ以外の場合は、他のビューが読み込まれている間、ビューがまだそこで待機していても、インジケーターは表示されません。メソッドは次のとおりです。

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath;
{   
[tableView deselectRowAtIndexPath:indexPath animated:YES];

//-- start activity indicator (will be stopped when view disappears)
UITableViewCell * cell = [tableView cellForRowAtIndexPath:indexPath];
[cell.contentView addSubview:m_activityIndicator];
[m_activityIndicator startAnimating];


return indexPath;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {



//--show the listViewController
CardListViewController *listViewController = [[CardListViewController alloc] initWithNibName:@"CardListViewController" bundle:nil];
NSString* selectedCardTypeName = [rootSelectionList objectAtIndex:indexPath.row];
enum CardTypes selectedCardType = cardTypeIDFromCardTypeName(selectedCardTypeName);
listViewController.selectedCardType =selectedCardType;
[self.navigationController pushViewController:listViewController animated:YES];
[listViewController release];


}

次のリストビューコントローラーの処理を開始する前に、アクティビティインジケーターを強制的に表示するにはどうすればよいですか?

4

1 に答える 1

3

まず、なぜ 2k 行を同時にロードする必要があるのでしょうか。だらだらやってみませんか?

まず、テーブル ビューをロードするときに、データソースを使用して表示する行数のみをカウントし、コア データをクエリしてその数のみを取得します。これにより、テーブル ビューは必要なすべてのセルを表示する準備が整います。

次に、必要なコンテンツのみをコア データから読み込みます。つまり、画面上のコンテンツのみを読み込みます。ユーザーがテーブル ビューを非常に高速にドラッグ アンド スクロールすると、多くのセルが必要なくロードされると想像してください。正しいことは、表示されているセルのみをロードすることです。これは、スクロール プロセスが停止したときに表示されるセルを意味します。

テーブル ビューのリソースを遅延してロードする方法については、Apple のこの例をご覧ください。 DTS40009394-Classes_RootViewController_m-DontLinkElementID_12

これは画像用ですが、オブジェクトのフェッチについても同じ考え方を行うことができます。

これを怠惰に行うと、アクティビティ インジケーターは必要ありません。

ところで、アクティビティ インジケーターの問題に戻ると、セルに更新を依頼する必要がある場合があります。

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath;
{   
    [tableView deselectRowAtIndexPath:indexPath animated:YES];

    //-- start activity indicator (will be stopped when view disappears)
    UITableViewCell * cell = [tableView cellForRowAtIndexPath:indexPath];
    [cell.contentView addSubview:m_activityIndicator];
    [m_activityIndicator startAnimating];
    [cell setNeedsDisplay];

    return indexPath;
}

乾杯

于 2010-08-27T02:55:50.943 に答える