ご覧いただきありがとうございます...
答えを探すどころか、この質問をどのように表現すればよいかさえわかりません...正直に言って、すべての助けが必要だったので、すべての助けが必要です!
これは常に発生するパターンであると確信しているため、おそらく非常に単純です。
モデル (MainLevel*) にエンティティがあり、それ自体と関係があります。
エンティティは法律のレベルのためのものであり、唯一の要件は、各法律に少なくとも 1 つの (最上位の) レベルがあることです。それ以上のサブレベルの数は、技術的には無限です (ただし、実際には、通常は約 5 であり、多くても 8 ~ 10 を超えない可能性があります)。当然のことながら、各子レベルには 1 つの親 (MainLevel.parentLevel) しかなく、どの親にも複数 (またはゼロ) の子 (NSSet *childLevels) を持つことができます。
私がやりたいことは、この関係のすべての構造を取得して、UITableView
または collectionView に入れることです。
次のような再帰関数があります。
- (NSDictionary *)getStructureOfLawForLevel:(MainLevel *)level
{
NSMutableDictionary *mutableDict = [[NSMutableDictionary alloc]initWithCapacity:50];
MainLevel *currentLevel = level;
[mutableDict setObject:currentLevel.shortName forKey:@"name"];
if (level.childLevels) {
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"order" ascending:YES];
NSArray *sortdescriptors = @[sortDescriptor];
NSArray *children = [currentLevel.childLevels sortedArrayUsingDescriptors:sortdescriptors];
for (MainLevel *childLevel in children)
{
NSDictionary *dict = [self getStructureOfLawForLevel:childLevel];
[mutableDict setObject:dict forKey:@"sublevels"];
}
}
return [mutableDict copy];
}
それからviewWillAppear:
私はこれを持っています:
self.structure = [self getStructureOfLawForLevel:self.selectedLevel]
これで、私が正しい方向に進んでいることを願っています...(現在ソート中の別の問題のためにテストされていません)。
UITableView
ただし、これから aまたは aを構成する方法はまだわかりUICollectionView
ません。つまり、カウンターを1つまたは2つ追加して、行数とセクション数を取得することで、それができると確信しています。それは非常に複雑に思えますが、私が見ていないより明白な方法があるに違いないと確信しています...
.order
データの唯一の基準は、エンティティ インスタンスの属性によって順序付けする必要があり、それは一意ではないということです。たとえば、各 childLevel は順序番号 1 の childLevel を持つことができます。これは、その親レベルでの順序です。
これが何千回も尋ねられた場合は申し訳ありません。答えを検索しようとしましたが、使用している検索用語が見つからないようです。
画面に表示する、編集しない、追加する、削除する以外は、このデータで何もしていません...それが関連しているかどうかはわかりません。
わかりやすくするために編集...
ドリルダウン タイプのテーブル ビューを実行するつもりはありません。構造全体のスナップショットを 1 つのビューに表示したいのですが、そこから (モデル内の他のエンティティとの関係を使用して) ドリルダウンする必要がある場合があります。
私のソリューションの編集
これが私がやったことです...
- (NSArray *)getStructureAsArrayForLevel:(MainLevel *)child
{
NSMutableArray *thisChildAndChildren = [[NSMutableArray alloc]initWithCapacity:2];
[thisChildAndChildren addObject:child];
if (child.childLevels)
{
// children exist
// sort the children into order
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"order" ascending:YES];
NSArray *sortdescriptors = @[sortDescriptor];
NSArray *children = [child.childLevels sortedArrayUsingDescriptors:sortdescriptors];
// get an array for each child via recursion
for (MainLevel *child in children)
{
[thisChildAndChildren addObject:[self getStructureAsArrayForLevel:child]];
}
}
return [thisChildAndChildren copy];
}
次に、同様の再帰関数を使用して配列を NSAttributedString に変換し、textView に表示します。
私は本当に再帰が好きではありません。理由はわかりませんが、ロジックを理解するのはとても難しいと思います。
提案、助けなどをくれたみんなに感謝します...