0

アプリの 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];
}
4

1 に答える 1

0

変化に適切に対応していますか?ドキュメントから...

コントローラーの管理対象オブジェクト コンテキストが processPendingChanges メッセージを受信するまで、変更は反映されません。したがって、フェッチされた結果コントローラーの結果セット内の位置が変更されるように管理対象オブジェクトの属性の値を変更した場合、コントローラーによって報告されるそのインデックスは通常、現在のイベント サイクルが終了するまで (processPendingChanges が呼び出されるとき) 変更されません。 )。

最初のインポート後、コンテキストが変更を処理していないため、FRCに通知していないようです

于 2013-01-17T00:32:16.867 に答える