1

Web からコンテンツを取得し、解析して表示する UITableView としてアプリを作成しています。取得して解析するには少し時間がかかるため、読み込みインジケータ ( MBProgressHUD ) を使用してバックグラウンドで読み込みを行います。TableView のフッターにボタンを追加したかったので、次のコードを作成しました。

UIButton *myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[myButton addTarget:self action:@selector(myAction)
   forControlEvents:UIControlEventTouchDown];
[myButton setTitle:@"Button Title" forState:UIControlStateNormal];
myButton.frame = CGRectMake(0, 0, 160.0, 40.0);
self.tableView.tableFooterView=myButton;

問題は、バックグラウンド コンテンツのロード コードの直後に ViewDidLoad() 中にテーブルビューで初期化されることです。

MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
    hud.mode = MBProgressHUDModeIndeterminate;
    hud.labelText = @"Loading";
    dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
        // Do something...
        [self getContent];
        [self.tableView reloadData];
        dispatch_async(dispatch_get_main_queue(), ^{
            [MBProgressHUD hideHUDForView:self.view animated:YES];
        });
    }); 

したがって、ビューが読み込まれると、ボタンが一番上に設定され (テーブルビューが空であるため)、再読み込みするとボタンが一番上に表示されたままになります。別のビューに移動して、フッターにボタンを表示するために戻ってくる必要があります。

コンテンツの読み込み後にボタンを設定する方法はありますか? 関数のように-(void)tableViewDidReloadData

ありがとう !

4

3 に答える 3

1

はい、(同期呼び出しである) と同じ呼び出しで実行すると[self.tableView reloadData]、データが読み込まれると表示されます。

MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
hud.mode = MBProgressHUDModeIndeterminate;
hud.labelText = @"Loading";
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
    // Do something...
    [self getContent];
    dispatch_async(dispatch_get_main_queue(), ^{
        [MBProgressHUD hideHUDForView:self.view animated:YES];
        [self.tableView reloadData];
        UIButton *myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [myButton addTarget:self action:@selector(myAction) forControlEvents:UIControlEventTouchDown];
        [myButton setTitle:@"Button Title" forState:UIControlStateNormal];
        [myButton setFrame:CGRectMake(0, 0, 160.0, 40.0)];
        [self.tableView setTableFooterView:myButton];
    });
});
于 2012-05-09T19:19:42.147 に答える
0

[self.tableView reloadData];メインスレッドでのみ呼び出す必要があります。

dispatch_async(dispatch_get_main_queue(), ^{
        [self.tableView reloadData];
        [MBProgressHUD hideHUDForView:self.view animated:YES];
    });
于 2012-05-09T19:24:00.387 に答える
0

MBProgress HUD を非表示にしてテーブルをリロードするときに作成する代わりに、myButton を作成して ViewDidLoad デリゲートのテーブルビュー フッターに割り当てないでください。

これを試してみてください

dispatch_async(dispatch_get_main_queue(), ^{
        UIButton *myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [myButton addTarget:self action:@selector(myAction)
        forControlEvents:UIControlEventTouchDown];
        [myButton setTitle:@"Button Title" forState:UIControlStateNormal];
        myButton.frame = CGRectMake(0, 0, 160.0, 40.0);
        self.tableView.tableFooterView=myButton;
        [self.tableView reloadData];
        [MBProgressHUD hideHUDForView:self.view animated:YES];
    });
于 2012-05-10T17:11:19.877 に答える