ビューコントローラーを作成し、Webサービスから非同期でフェッチしたデータを表示するサブビューとしてテーブルビューを追加しました。最初、ビューには空のテーブルが表示されます。データがフェッチされた後、データは並べ替えられ、テーブルビューのデータを保持する配列に格納されます。その時点でtableViewでreloadDataを呼び出すと、データが正しく表示されます。この時点で、テーブルビューは正常に機能します(スクロールは期待どおりに機能します)。ただし、セルをクリックするとすぐに詳細ビューコントローラー(モーダルで表示)に移動し、テーブルビューが一番上にスクロールされ、スクロールが無効になります(ただし、コンテンツはバウンスします)。データはまだそこにあります。テーブルのセルを上にドラッグすると、さらに多くのデータが表示されますが、離すと画面から元に戻ります。
この問題をさらに複雑にしているのは、テーブルビューに表示されるコンテンツを変更するためのカスタムスプリットビューコントローラーです。ジェスチャで表示および非表示になり、オブジェクトを押すとメインテーブルビューのデータが再フェッチされます。サービスがデータのロードを終了し、テーブルデータが更新された時点で、テーブルは予想どおりに再びスクロールします。
このアプリは、電話デバイスタイプのiOS6.0以降のみをサポートします。
Webサービスからデータを取得するコードは次のとおりです。
- (BOOL) getPatientVisits {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
NSDictionary *response = [[HMWebServiceFacade defaultFacade] getVisitListingForPatientId:appDelegate.selectedPatientId withUserCredential:appDelegate.usernamePasswordHash];
dispatch_async(dispatch_get_main_queue(), ^{
if ([[response objectForKey:@"status"] isEqualToString:@"OK"])
{
patientVisits = [[HMCommonUtils commonUtils] sortedArrayOfVisits:[response objectForKey:@"visits"]];
}
else if ([response objectForKey:@"RequestError"])
{
[[HMCommonActions standardActions] displayErrorAlertMessage:[response objectForKey:@"RequestError"]];
}
else
{
[[HMCommonActions standardActions] displayErrorAlertMessage:@"There were no visits for your loved one." withTitle:@"Sorry"];
patientVisits = nil;
}
[visitsTable reloadData];
[self viewWillAppear:YES];
});
});
return false;
}
viewDidLoad[self getPatientVisits];
で、分割ビューでクリックされたオブジェクトのコールバック関数と同様に呼び出します。