サーバーに (AFNetworking を使用して) 呼び出しを行っています。そのデータを取得したら、それを配列に入れ、画面の更新を呼び出します。ここまでは順調ですね。しかし、サーバーへの非同期呼び出しを使用して、表示するデータがないことをユーザー (セル内など) に伝える方法がわかりません。そして、表示するデータがある場合は、「表示するデータがありません」セルを取り除きます。
iOS 6.1 を使用していますが、iOS 5 をサポートしたいと考えています。
サーバーに (AFNetworking を使用して) 呼び出しを行っています。そのデータを取得したら、それを配列に入れ、画面の更新を呼び出します。ここまでは順調ですね。しかし、サーバーへの非同期呼び出しを使用して、表示するデータがないことをユーザー (セル内など) に伝える方法がわかりません。そして、表示するデータがある場合は、「表示するデータがありません」セルを取り除きます。
iOS 6.1 を使用していますが、iOS 5 をサポートしたいと考えています。
私の理解が正しければ、結果がない場合に「表示するデータがありません」というメッセージを表示し、データが利用可能になったときにそれを置き換える方法が必要です。
私のアプローチは、通常、コンテンツの読み込みを開始するとき (つまり、最初にサーバーを呼び出すとき) に読み込みインジケーター (テーブル ビューに重ねて表示) をユーザーに表示することです。現在データをロードしているかどうかを追跡するフラグをコントローラーに設定できます。ロードを開始するときはこれを YES に設定し、ロードが完了すると NO に設定します。読み込み中は、テーブルにセルを表示することはできません (読み込み中であることをユーザーに示す他のディスプレイがあると仮定します)。例えば
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (isLoading) return 0; //Don't display any cells while loading
if (modelArray.count == 0) return 1; //1 row for the cell indicating there's no data
return modelArray.count; //1 row for each entry in array
}
サーバーからデータが返されたら、読み込みインジケーターを削除し、テーブル ビュー データを更新します。
データが返されない場合、おそらくモデル配列は空になります。UITableViewDataSourceでこのケースを確認しtableView:cellForRowAtIndexPath:
、配列が空の場合は、データがないことを示すメッセージを含むセルを返します。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (modelArray.count == 0)
{
return noResultsMessageCell;
}
else
{
<normal cell dequeueing code>
}
}