このプロジェクトでは、3レベルのカタログを作成する必要があります。
- レンダリングは以下の通り:
アイデア:全体は間違いなくUITableViewで、3レベルのカタログなので、ここでtableHeaderViewとsectionHeaderを使うのはあまり意味がないので、すべてcellを使っています。それでも、予想される2つの重要な問題があります。1つは、セルが第1レベルなのか、第2レベルなのか、第3レベルなのかを区別する方法、もう1つは、セルが拡大しているのか、縮小しているのかを区別する方法です。もうひとつは、セルが膨張しているのか収縮しているのかを区別する方法です。そこで、これらの問題を解決するためのプロパティを定義したモデル・クラスを作りました。
- コアコード1、このコードはウェブリクエストを模倣し、主な役割はデータモデルに値を割り当てることです。
//
for (NSInteger i = 0; i < array.count; i++) {
QQLevelModel *model = [[QQLevelModel alloc] init];
model.depict = array[i][@"depict"];
model.firstIndex = i+1;
[self.dataArray addObject:model];
//
NSArray *secondLevelData = array[i][@"secondLevelData"];
for (NSInteger j = 0; j < secondLevelData.count; j++) {
QQLevelModel *model = [[QQLevelModel alloc] init];
model.depict = secondLevelData[j][@"depict"];
model.firstIndex = i+1;
model.secondIndex = j+1;
[self.dataArray addObject:model];
NSArray *thirdLevelData = secondLevelData[j][@"thirdLevelData"];
//
[thirdLevelData enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
QQLevelModel *model = [[QQLevelModel alloc] init];
model.firstIndex = i+1;
model.secondIndex = j+1;
model.thirdIndex = idx+1;
model.depict = obj[@"depict"];
[self.dataArray addObject:model];
}];
}
}
- コアコード2、このコードは、セルのクリックイベントは、最初の2つのレベルのセルをクリックすると、UITableViewが表示されますまたは効果の収縮。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
QQLevelModel *current_model = self.dataModel.dataArray[indexPath.row];
// クリックは、セルである場合
if (current_model.secondIndex == 0 && current_model.thirdIndex == 0) {
current_model.isOpen = !current_model.isOpen;
NSMutableArray *indexPathArray = @[].mutableCopy;
[self.dataModel.dataArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
QQLevelModel *model = obj;
BOOL is_belong = model.firstIndex == current_model.firstIndex; //現在のグループであるかどうか
BOOL is_current = model.secondIndex == 0; //それは第一レベルのセルであるかどうか
//現在のグループ化で、セルではない場合は、すべての隠された、閉じる
if (is_belong && !is_current) {
model.isShow = !current_model.isOpen;
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:idx inSection:0];
[indexPathArray addObject:indexPath];
}
}];
[self reloadRowsAtIndexPaths:indexPathArray withRowAnimation:UITableViewRowAnimationFade];
return;
}
// クリックは、セカンダリセルである場合
if (current_model.thirdIndex == 0) {
NSMutableArray *indexPathArray = @[].mutableCopy;
[self.dataModel.dataArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
QQLevelModel *model = obj;
BOOL is_belong = model.secondIndex == current_model.secondIndex && model.firstIndex == current_model.firstIndex; //現在のグループであるかどうか
BOOL is_current = model.thirdIndex == 0; // それは二次セルであるかどうか
//現在のグループ化で、セルの2番目のレベルではない場合は、すべての隠された
if (is_belong && !is_current) {
model.isShow = !model.isShow;
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:idx inSection:0];
[indexPathArray addObject:indexPath];
}
}];
[self reloadRowsAtIndexPaths:indexPathArray withRowAnimation:UITableViewRowAnimationFade];
return;
}
}
、全体的なコードのロジックは複雑ではありません、あなたの仲間を歓迎し、交換し、一緒に学びます。