0

問題:

私の CoreData モデルには、List と Item という 2 つのエンティティがあり、1 対多の関係があります。私の現在のデザインには、システム リストとユーザー リストの 2 種類のリストがあります。システム リストは最初の起動時にシステムによって作成され、ユーザー リストはいつでもユーザーによって作成されます。

私の TVC では、関連付けられたリスト (セクション タイトルとしてリスト名を使用) によってグループ化されたすべてのアイテムを提示したいと考えています。さらに、すべてのシステム リストを常にユーザー リストの上に配置したいと考えています。

たとえば、次のように DB に list のすべてのインスタンスがあるとします。

システム一覧:受信箱

ユーザー リスト: FruitListShoppingList

期待される結果は次のようになります。

  • 受信トレイ
    • InboxItem1
    • InboxItem2
  • フルーツリスト
    • FruitListItem1
  • 買い物リスト
    • アップル
    • オレンジ

アプローチ:

FRC では、sectionNameKeyPath を「list_name」として FRC に設定することで、最初の目標を達成できます。しかし、システムリストの位置を修正することに問題があります(この場合、受信ボックスは常にインデックス0にあるはずです)。ただし、ユーザーが「A」から「J」で始まる名前のリストを入力すると問題が発生し、これらのリストはすべてinboxの上に配置され、「list_type」をセカンダリソートキーとして追加して修正しようとしましたが、しかし、うまくいきません。

NSFetchRequest *requst = [[NSFetchRequest alloc]initWithEntityName:ENTITY_ITEM];

NSArray *sortDescriptors = @[
                                [NSSortDescriptor sortDescriptorWithKey:@"belongsToList.list_name" ascending:YES],
                                [NSSortDescriptor sortDescriptorWithKey:@"belongsToList.list_type" ascending:NO]];

requst.sortDescriptors = sortDescriptors;
requst.predicate = [self predicateForListType:type selectedList:list];
requst.fetchBatchSize = 20;

_fetchedResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:requst managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"belongsToList.list_name" cacheName:nil];

一時的な解決策:

この問題を解決するために考えられる一時的な解決策は、プレフィックス文字列をリスト名に追加し、それらを DB から別の属性として保存し、それを sectionNameKeyPath として使用することです。

例: "0-" - システム リスト用 ("Inbox" -> "0-Inbox")

"1-" - ユーザー リスト ("ShoppingList" -> "1-ShoppingList")

のプレフィックスを削除します-tableView:titleForHeaderInSection:。しかし、このソリューションはオーバーヘッドを生み出します。これは、すべての開発者が FRC と TBV を扱う際に直面する共通の問題であるため、はるかに優れたソリューションが存在するはずです。

入力はありますか??!!!

4

1 に答える 1

1

エンティティに次のような一時属性を追加して、次のように並べ替えることができsectionIdentifierます。List

[NSSortDescriptor sortDescriptorWithKey:@"list.sectionIdentifier" ascending:YES]

最初のソート記述子として。

sectionIdentifier は、意図した方法でソートされ (「システム」が最初)、そこから適切なセクション名を再構築して に返すことができるものであれば何でもかまいませんtitleForHeaderInSection

于 2013-10-30T09:33:53.123 に答える