2011-12-21 13 views
5

Webサービスからデータを取得する前にテーブルがロードされている状況があります。connectionDidFinishLoadingからデータを取得する前にUITableViewが表示される

デバッグすると、NSMutableArrayに123個のオブジェクトがありますが、テーブルに反映されていないことがわかります。

これは私のconnectionDidFinishLoading方法です:

-(void)connectionDidFinishLoading:(NSURLConnection *)conn{ 
myData = [[NSString alloc] initWithData:xData encoding:NSUTF8StringEncoding]; 
SBJsonParser *jParser = [SBJsonParser new]; 
NSError *error = nil; 
NSArray *jsonObjects = [jParser objectWithString:myData error:&error]; 
NSMutableArray *books = [[NSMutableArray alloc] init]; 

for(NSDictionary *dict in jsonObjects) 
{ 
    Book *b = [Book new]; 
    b.bookName =[dict objectForKey:@"name"]; 
    b.published = [dict objectForKey:@"published"]; 
    [books addObject:b]; 

} 
self.bookArray = books; 
[self.tableView reloadData]; 
NSLog(@"myData = %@",myData); 
} 

私はこれをデバッグする場合、私は私のjsonObjectsを取得し、私のコレクションを移入しています。しかし、私はテーブルがまだ空であることに気付きます。

(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
... 
Book *b = (Book *)[self.bookArray objectAtIndex:[indexPath row]]; 
cell.textLabel.text = b.bookName; 
.... 

誰もが私が欠けている何で私を助けることができます:ちょうどこのことを明確にする

は私tableView方法ですか?

+0

cellForRowメソッド全体を見てみましょう。 rowsForSectionを実装しましたか? – Dancreek

+0

@DancreekあなたはnumberOfRowsForSectionを意味すると思いますか?とにかく、それと[tableview reloadData]は私がその話題を読んだときの疑いでした。彼はreloadDataを呼び出していますが、後者は不要です。 – barley

+0

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)セクション{ return bookArray.count; } – Matt

答えて

1

呼び出しスレッドを確認します。 mainThread以外でUIKitの更新を行うことはできません。私はあなたのconnectionDidFinishLoading:別のスレッドで呼び出され、それはここで問題だと思う。

はあなたが表示するデータがある場合に表示するデータがない場合のために、ケースのためnumberOfRowsInSection(およびnumberOfSections)によって返されるかを検討する必要が

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self.tableView reloadData]; 
}); 
1

を試してみてください。 reloadDataを呼び出すたびに、tableViewはこれら2つのメソッドを呼び出して、データソースに関する最新の情報を取得します。データがロードされていない場合、これらのデリゲートメソッドは適切な値をレポートする必要があります。データがロードされていない場合は、nil値をテストするか、同様のテストを行い、適切な値を返すことができます。データがロードされると、デリゲートメソッドはデータソース内のコンテンツのサイズに基づいて値を返す必要があります。

これらのメソッドのコードを表示すると、誰かがこれがあなたの問題であるかどうかをコメントできます。

+0

2番目の質問では、コンテンツが空であることがわかっている場合は、tableViewの 'hidden'プロパティを設定することができます。私が言及したデリゲートメソッドの1つの中でこれを行うことができます。表示するコンテンツがある場合は、非表示にしてください(非表示= NO)。 – Jim

+0

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { //セクションの数を返します。 リターン1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)セクション{ return bookArray.count; } 私はこれらの方法で多くを持っていません。 – Matt

+0

私のプログラムをデバッグしただけで、配列にデータが入る前にnumberOfRowsInSectionが1回呼び出され、再び呼び出されることはありません。 – Matt

1

やり方は、は、内容がダウンロードされるまでテーブルを読み込まないので、 webservicesからです。

これはIB経由でデリゲートを設定しないためです。このWebリクエストの完了後、コードを介してデリゲートとデータソースを設定し、reloadDataメソッドを呼び出します.Webコールが処理されるまでテーブルを待機させることができます。データがロードされている間にカスタムHUDのきれいなアクティビティインジケータを提供します。仕事をする

+1

downvoting中にコメントを追加してください –

+0

デリゲートを設定するだけです。データソースメソッドでは、ダウンロードが完了したかどうかを考慮する必要があります。 –

+0

"ダウンロードが完了した場合、これを考慮する必要があります。手段? –

関連する問題