0

私はtableViewと、URLからデータをフェッチしてテーブルをリロードする「リロード」ボタン、コストのかかる操作(特にフェッチ部分)を持っています。

これが起こっている間にユーザーに情報を表示したいので、「読み込み中」のUITextViewを一番上に置き、フェッチ/リロード操作を行い、UITextViewを削除すると思いました。

コードは次のとおりです。

- (IBAction)refreshData:(id)sender {

    UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(0, self.view.frame.size.height-30, self.view.frame.size.width, 30)];
    [self.view addSubview:textView];
    textView.text = @"Loading..";
    textView.textColor = [UIColor whiteColor];
    textView.backgroundColor = [UIColor grayColor];
    textView.editable = NO;

    [self fetchData];
    [self.tableView reloadData];

    [textView removeFromSuperview];
}

私が得た動作は、UITextView が画面にレンダリングされる前に fetchData が実行されることです。これは、UITextView が画面に表示される前に実行される fetchData 内に NSLogs があるためです。

ここで私が見逃している明らかなものはありますか?ありがとう。

4

1 に答える 1

1

に置き換え[self fetchData];ます

[self performSelectorInBackground:@selector(fetchData) withObject:nil];

次に、fetchDataメソッド内で、フェッチが完了した後、追加します

[self performSelectorOnMainThread:@selector(fetchDataFinished) withObject:nil waitUntilDone:NO];

ここで、新しいメソッドfetchDataFinishedは次のように定義されます。

-(void) fetchDataFinished{
    [self.tableView reloadData];
    [self.textView removeFromSuperview];
}

textViewこのメソッドでアクセスできるように、プロパティを作成する必要があることに注意してください。

私はあなたの特定のケースで上記を試していませんが、多くの同様の状況で同様の構造をうまく使用しました。

于 2012-04-18T22:05:18.093 に答える