3

1 つのアイテムが複数のカテゴリに属する​​ことを除いて、カテゴリ内のアイテムを含む単純なカタログ マネージャー機能があります。

アイテムには、親カテゴリの NSSet である「parents」キーがあります

カテゴリには、そのサブアイテムの NSOrderedSet である「items」キーがあります

NSFetchedResultControllerとそのデリゲートを使用して、テーブルにアイテムを入力しています

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"(ANY parents == %@)", self.category];

[fetchRequest setFetchBatchSize:30];
[fetchRequest setSortDescriptors:@[????????];

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;

NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error]) {
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}

したがって、このコードを使用すると、self.category のアイテムのリストを取得できます。

私のUIにはDrag and Drop機能があります。そのため、カテゴリ内でアイテムを移動できます。

私の質問: Category1 と Category2 の両方に、同じアイテム Item1 と Item2 への参照が含まれています。Category1 に Item1、Item2 の順序、Category2 に Item2、Item1 の順序が必要です。そのため、category.items プロパティを にしましNSOrderedSetた。

しかし、category.items のインデックスでアイテムを並べ替えることができません

ソート記述子でブロックを使用しようとしました - 動作しませんでした、ソート記述子でセレクターを使用しようとしました - 動作しませんでした、ソート記述子をサブクラス化しようとしました - 何とか動作しますが、インデックスを変更しているときにアイテムを更新しませんカテゴリ.アイテム。
私の NSSortDescriptorSubclass でこのように:

- (NSComparisonResult)compareObject:(Item*)object1 toObject:(Item*)object2 {

int index1 = [self.category.items indexOfObject:object1];
int index2 = [self.category.items indexOfObject:object2];

if (index1 > index2) {
    return NSOrderedDescending;
} else if (index1 < index2) {
    return NSOrderedAscending;
}

return NSOrderedSame;

} ただし、Category.items で順序を変更すると、UI でアイテムの順序が更新されません。

ですから、category.items セットのインデックスでアイテムを並べ替えるのを手伝ってください。おそらく、いくつかのキー、演算子、式、その他を使用してそれを行う方法があります。ありがとう。

4

2 に答える 2

2

順序対多の関係を使用しないことをお勧めします。それらは実際には期待どおりに機能しておらず、ニーズに合わないようです。

代わりに、ソートを行うために独自の属性を導入する必要があります。と の両方、およびattributecategoryItemに対して一対一の関係を持つエンティティを作成できます。CategoryItemsequence

FRC でcategoryItemエンティティを取得し、表示するときcategoryItem.itemにアイテムのプロパティにアクセスするために使用します。順序を変更する場合 (ドラッグ アンド ドロップなどで)、すべてcategoryItemの の番号を付け直し、正しいシーケンス番号を割り当てる必要があります。

- 編集 -

categoryItemアイテムの詳細が変更されたときに「ダーティ」としてマークするには、次のようなメソッドmarkDirtyを実装できます。categoryItem

// CategoryItem.m
-(void)markDirty {
    [self willChangeValueForKey:@"sequence"];
    [self didChangeValueForKey:@"sequence"];
}

// EditItemController.m
item.attribute = newAttribute; 
for (CategoryItem *i in item.categoryItems) { [i markDirty]; }
于 2013-04-02T16:51:01.310 に答える
1

Core Data の 1 対多の関係はNSSets であり、s ではありませんNSOrderedSet。このため、カテゴリ内のアイテムのインデックスは保存されません。のような別のエンティティを Core Data モデルに追加できますIndexValueIndexValueには 2 つの属性、categoryIdまたはcategoryName(意味のある方) と がありcategoryIndexます。Item次に、このエンティティと 1 対多の関係を持ちます (これらのエンティティを再利用する必要がないため、1 対 1 の逆の関係があります。エンティティは一意である必要があります)。入っているそれぞれについてCategoryItemIndexValue作成されます。

編集: OS X 10.7 および iOS 5NSOrderedSetで 1 対多の関係をサポートするために、順序付きプロパティが追加されたようです。これは、あなたがターゲットにして使用しているものでなければなりません。この機能に関するドキュメントはまばらですが、関係を取得するときに s を使用する必要なく、順序を保持する必要があります。順序の変更に関する限り、これがどのようにサポートされているかわかりません。この方法を使用すると、大規模なデータ セットでのパフォーマンスが、前述の方法と比較して低くなります。NSSortDescriptor

于 2013-04-02T16:15:13.943 に答える