インデックスカードとタグ(またはその他)の1対多の関係を設定する場合、フェッチされたインデックスカードオブジェクトには、プロパティとしてタグのNSSetが必要です。他の人も同じです。セットの数を取得して、適切な各アイコンの横に表示できるはずです。
..私があなたの質問を誤解していない限り。
編集:2番目の部分に答えるには、実際にcellForRowAtIndexパスに条件を設定して、各セットのカウントをチェックし、アイコンで表示するか(0の場合は通常は問題ありません)、それが正しいかどうかをチェックする必要があります。 0と言ったとおりの場合は、画像を非表示にします。セルがレンダリングされるまでにデータが既にフェッチされているため、どちらのソリューションでもアプリの速度が低下するとは思いませんが、0であるかどうかを確認せずにカウントを渡すだけのソリューションは、通常、全体的に高速です。 。
編集してサンプルコードを提供します
。CoreDataモデルには、IndexCardエンティティがあり、次に、関連する可能性のあるオブジェクトのタイプごとにエンティティがあります。
1)モデル:
IndexCard-他の各エンティティと1対多の関係があります
鬼ごっこ
位置
人
2)このモデルと対応するObjectクラスを作成すると、ヘッダーに次のようなIndexCardクラスが作成されます。
@property (nonatomic, strong) NSSet *tags
@property (nonatomic, strong) NSSet *locations
@property (nonatomic, strong) NSSet *people
そしてもちろん、その実装では次の
@dynamic tags
@dynamic locations
@dynamic people
3)このコアデータモデルが確立されたので、nsfetchrequestを実行できます(もちろん、テーブルビューを使用する場合は、テーブルをスクロールするときに必要なIndexCardを動的にフェッチするため、nsfetchedresultscontrollerを使用する必要があります)。このコードは、スコープ内に使用可能なNSManagedObjectContextがあり(理想的にはAppDelegateから渡され、ivarとして設定される)、IndexCardオブジェクトに検索可能な何らかのkey/idプロパティがあることを前提としています。これを「number」と呼びます。
NSNumber *numberWeWant = [NSNumber numberWithInt:1];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.entity = [NSEntityDescription entityForName:@"IndexCard" inManagedObjectContext:ourContext];
request.predicate = [NSPredicate predicateWithFormat:@"number == %@", numberWeWant];
NSError *error = nil;
NSArray *results = [context executeFetchRequest:request error:&error];
//didn't bother error checking in case no IndexCard matches
IndexCard *ourCard = [results lastObject];
//you can now use these to display in the cell or hide the appropriate icons if they = 0
int numTags = ourCard.tags.count;
int numLocations = ourCard.locations.count;
int numPeople = ourCard.people.count;
//just a sample of how we would access the individual related objects
for(Tag *tag in ourCard.tags)
{
//do whatever you want with each tag here
}
繰り返しますが、このコードは単一のIndexCardをフェッチするためのものです。実際のテーブルでは、nsfetchedresultscontrollerを含むビューをロードするときにnsfetchedresultscontrollerを初期化し、cellForRowAtIndexPathのIndexPath.rowに一致する位置でIndexCardにアクセスします。
これは、IndexCardが関連付けることができるオブジェクトのタイプが有限であることも前提としています。タイプがランダムに変化して増加する可能性がある場合は、このアプローチを変更する必要があります。
うまくいけば、これがお役に立てば幸いです。