1

ユーザーがUITableViewの一番下までスクロールしたときに、UIActivityIndi​​catorViewを「表示してアニメーション化」させようとしています…。

テーブルビューの下部に到達すると、完了するまでに数秒かかるWebリクエストが作成され、UIActivityIndi​​catorViewが「停止して非表示」になります。

tableView:willDisplayCell:forRowAtIndexPathを使用してUIActivityIndi​​catorViewの外観をトリガーしています:

リストアイテム

ただし、問題は、メソッド全体(つまり、tableView:willDisplayCell:forRowAtIndexPath :)が呼び出されるまで、UIActivityIndi​​catorViewがiPhone画面に表示されず、それまでにすでに非表示になっていることです。

方法に関するアイデア:

  1. インジケータービューを表示する
  2. Webリクエストを行う
  3. インジケータービューを非表示にしますか?

新しいスレッド?もっといい方法?

ありがとう!!

具体的には、私の関数は次のようになります

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (self.results && indexPath.row == [self.results count] - 1) {
        [self.loadingSignal setHidden:NO]; // <====== my UIActivityIndicatorView is called "loadingSignal"
        [self.loadingSignal startAnimating];

    /// make web request that will take a few seconds

        [self.loadingSignal setHidden:YES];
        [self.loadingSignal stopAnimating];

        }
    }
}
4

2 に答える 2

1

わかった。上記のコード スニペットから、いくつかの問題が見られます。

  1. セルを表示する前に、リクエストが完了するのを待つ予定のようです。これにはいくつかのマイナス点があります。ユーザーにとっては煩わしく、リクエストの送信中に UI がフリーズする可能性が高くなります (数秒かかる場合があります)。
  2. すべてがwillDisplayCellメソッド内で発生します。

この問題を解決する方法は次のとおりです。

  1. セル トリガーの読み込みを非同期で表示します。
  2. 「読み込み中...」と表示されたセルにスピナーを表示します (Tweetie 2 を参照してください)。
  3. リクエストからのコールバックを待ちます
  4. モデルに応答を入力します
  5. 「読み込み中...」セルを削除します
  6. データの再読み込みを強制する[tableView reloadData]

これにより、やりたいことを達成できるはずです。

于 2009-12-08T19:07:23.420 に答える
1

UITableViewのcellForRowAtIndexPath:メソッドでこれを試すことができます

于 2009-12-08T19:07:51.043 に答える