2011-10-23 10 views
0

CoreDataでUITableViewを更新しています。起動時に、最初の行が(null)として表示されます。下にスクロールすると、ロードされます。それはちょうど最初に表示されません。最初の行にUITableView(null)が表示されます

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; 
     [cell setAccessoryType: UITableViewCellAccessoryDisclosureIndicator]; 
    } 

    // set text for each cell 
    [cell.textLabel setText: [dataManager getProjectValueForKey: @"Title" atIndex: [indexPath row]]]; 
    [cell.detailTextLabel setText: [[[dataManager getProjectValueForKey: @"pid" atIndex:[indexPath row]] stringByAppendingString: @": "] stringByAppendingString: [dataManager getProjectValueForKey: @"Sponsor" atIndex:[indexPath row]]]]; 

    return cell; 
} 

dataManagerコアデータとは何ですか?私は、セルが準備が整う前にデータを表示しようとしているので、起動時に遅れているか、何かが遅れているように感じます。しかし、私は知らない。

+0

最初のセルをスクロールして画面に戻すと、適切なテキストが読み込まれますか?また、コアデータの結果をあなたのUITableViewに取り込むためにNSFetchedResultsControllerを調べることもできます。そのユースケースに合わせて設計され、高度に最適化されています。 –

+0

はい、彼らはopで述べたとおりです。私はちょっとこれに新しいです。 –

+0

何が起こっているのか正確に言うのは難しいです。 '-tableView:cellForRowAtIndexPath:'にブレークポイントを設定します。最初に '-getProjectValueForKey:atIndex:'に入って、なぜそれがnilに戻ってくるのかを見てください。 –

答えて

1

実際には、Core Dataに既に組み込まれている素晴らしい "dataManager"があります。それはNSFetchedResultsControllerと呼ばれます。あなたはいつもこれは典型的には、いくつかの他のヘルパー関数でtableView:cellForRowAtIndexPath:内で行われず、

[[self.fetchedResultsController fetchedObjects] objectAtIndex:indexPath.row]; 

を使用して、テーブルセルの正しいデータオブジェクトを取得することができます。フェッチされた結果コントローラは、それを表示するために必要なデータを検索するために必要なすべてのものを処理します。

この一般的なデザインパターンについては、AppleのさまざまなCore Dataコードの例も参照してください。

関連する問題