アプリの Core Data から読み込まれた連絡先のリストを含むテーブル ビューを作成しようとしています。
私はNSFetchedResultsControllerを使用しています。
アプリを起動すると、アドレス帳から連絡先を抽出して Core Data に追加します。これは、アドレス帳とは別に連絡先を管理できるようにするためです。連絡先オブジェクトの作成時に、次のコードを含む create メソッドがあります。
contact = [NSEntityDescription insertNewObjectForEntityForName:@"Contact" inManagedObjectContext:context];
contact.name = name;
NSString *initial = [name substringToIndex:1];
NSString *capitalisedInitial = [initial capitalizedString];
contact.nameInitial = capitalisedInitial;
これにより、連絡先の最初の文字が連絡先オブジェクトの属性に保存されます。
私のテーブルビューコントローラーコードでは、次のようにNSFetchedResultsControllerを設定しました
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Contact"];
NSSortDescriptor *descriptor1 = [NSSortDescriptor sortDescriptorWithKey:@"nameInitial" ascending:YES];
NSSortDescriptor *descriptor2 = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)];
request.sortDescriptors = [NSArray arrayWithObjects:descriptor1, descriptor2, nil];
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:self.contactsDatabase.managedObjectContext sectionNameKeyPath:@"nameInitial" cacheName:nil];
私の問題は、アプリを初めて実行したとき (デバイスからアプリを削除した後) にのみ発生します。アプリを開いた直後に連絡先ページを開くと、完全に空白のテーブルが表示され、どの時点でも更新されません。アプリを (削除ではなく) 閉じて再起動すると、テーブルは正常に動作します。
上記のコードの最後の行で、@"nameInitial" を削除し、代わりに nil を sectionNameKeyPath に使用すると、すべて問題なく正常に動作します。ただし、追加されるショートカットのアルファベット順の列はユーザーが期待しているため、これらのセクションが本当に必要です。
データベースの準備ができていないか、テーブルが最初にロードされたときに何か関係があると思いますが、これらのフェッチされた結果コントローラーはデータベースへの更新をリッスンし、準備ができたらそれに応じて更新するはずだと思いましたか?
どんな考えも本当に感謝しています...
編集:
さらに詳しい情報:
最初の読み込みで、numberOfSectionsInTableView デリゲート メソッドが 0 を返します。これが問題の原因のようです。その後のロードでは、正しい数値が返されます。フェッチされた結果コントローラーをログに記録しましたが、毎回完全な結果セットをフェッチしています...
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
NSLog([NSString stringWithFormat:@"Number of Sections = %i", [[self.fetchedResultsController sections] count]]);
return [[self.fetchedResultsController sections] count];
}