2012-05-09 10 views
1

私は、Webからコンテンツを取得して解析して表示するUITableViewとしてアプリケーションを作成しています。それを取得して解析するのに少し時間がかかるので、ローディングインジケータ(MBProgressHUD)を使用して、バックグラウンドでロードします。私は、テーブルビューのフッターにあるボタンを追加したいので、私はこのコードを作っ:テーブルリロード後にUITableView FooterViewを設定する

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; 

probleはちょうど私のバックグラウンドコンテンツローディングコードの後に​​)それはの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のような機能?

ありがとうございます!

答えて

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]; 
    }); 
}); 
+0

実際には機能しますが、ボタンは空で、タイトルをタップすると表示されます。シミュレータのバグ? – Abel

+0

それは前によく見えましたか? – runmad

+0

はい、それはうまく見えましたが、テーブルビューの上部にあります – Abel

0

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

dispatch_async(dispatch_get_main_queue(), ^{ 
     [self.tableView reloadData]; 
     [MBProgressHUD hideHUDForView:self.view animated:YES]; 
    }); 
+0

なぜそれは良いですか? – Abel

+0

リロード操作は、すべての種類のボタン、ジオメトリなどを設定するだけでなく、GUIを更新する必要があるGUI関連の操作であり、メインスレッドは時間を消費しないGUI関連のものや操作用です。別のスレッドでGUI関連の操作を実行すると、予期しない動作に直面します。 – graver

+0

ああ、情報ありがとう! – Abel

0

myButtonのを作成して試してみてください、あなたがテーブル

をMBProgress HUDを隠し、リロードされた時点で、それを作成する代わりに、こののの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]; 
    }); 
関連する問題